6. 数据类型 —— 元组

元组属于容器存储、不可变、顺序访问的数据类型。元组可以看作是不可变的列表,除了这一点外元组和列表的特征十分相似。

1. 创建元组

元组使用 ( ) 来定义,直接把一个被 ( ) 包含,由 , 分隔的数据赋值给一个变量即可创建元组对象。

>>> tup = (1, 2, 3)                                 # 通过直接将由圆括号 () 括起来的对象赋值给变量创建元组
>>> tup
(1, 2, 3)
>>> tup = (1, )                                     # 如果元组对象中只有一个元素时,必须在元素后添加一个 ',' 否则不会创建元组
>>> tup
(1, )
>>> tup = (1, 'a', [1])                             # 和列表一样,元组的元素可以是任何数据类型
>>> tup
(1, 'a', [1])

元组同样可以使用 tuple() 函数来创建元组对象

>>> tup = tuple([1, 2, 3])
>>> tup
(1, 2, 3)

2. 元组的基本操作

  • 访问元组中的元素

    元素属于顺序访问的序列类型,因此可以通过索引和切片操作对元组中的元素进行访问

tup = (1, 2, 3, 4, 5, 6, 7)
tup[0] # 元组索引和字符串一样,从 0 开始,最大为列表的长度 - 1
1
tup[-1] # 使用负索引访问元组元素
7
tup[1:3] # 元组的切片操作返回一个包含元组部分元素的新的元组
(2, 3)
tup[::-1] # 反序访问元组
(7, 6, 5, 4, 3, 2, 1)
tup = ([1, 2, 3],)
tup[0][1] # 元组中嵌套的任意序列数据类型的访问,注意元组中只有一个元素时,元素后边要加 ','
2
```

  • 元组不可变性

    元组中的元素一般来说是不可以改变的,但由于元组中可以包含列表、字典等其他数据类型,而这些数据类型中的元素是可以改变的,因此在这种情况下元组发生了 "改变"。元组的不可变性仅适用于元组本身元素顶层,而非其元素的内容

>>> tup = ([1, 2, 3], )
>>> tup[0][1] = 7                                    # 改变元组中列表元素的值,可以在 "改变" 元组
>>> tup
([1, 7, 3])
>>> tup[0] = 1                                       # 如果直接更改元组的元素会引发一个 TypeError 异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

3. 元组的一些操作符和函数

元组属于序列数据类型,因此大部分序列操作和函数适用于元组,但由于元组的不可变性,一些需要对序列对中元素进行修改的函数并未对元组进行实现。

操作符
  • + 操作符:对元组使用 + 操作符可以将两个元组连接在一起创建一个新的元组

(1, 2) + (3, 4)
(1, 2, 3, 4) # 直接生成一个新的元组而并非对原元组进行修改
```

  • * 操作符:使用 * 操作符可以将元组重复 N 次

(1, ) * 7
(1, 1, 1, 1, 1, 1, 1)
```

  • innot in:成员关系操作,测试对象是否是元组的元素

tup = (1, 2, 3)
1 not in tup
False
1 in tup
True
```

函数

元组很像列表,但由于元组的不可变性,因此在进行绝大多数函数操作时,首先将元组转换为列表,然后继续后边的操作。

>>> tup = (3, 1, 2)
>>> li = list(tup)                                    # 首先将元组转换为列表
>>> li.sort()                                         # 对列表进行排序
>>> tup = tuple(li)                                   # 将排好序的列表转化为元组
>>> tup
(1, 2, 3) 

元组仅有的两个方法 indexcount,这两个方法对元组跟对列表一样

>>> tup = (1, 2, 3, 1)
>>> tup.index(1)
0
>>> tup.count(1)
2

4. 元组的意义

元组的意义在于它的不可变性。一个元组对象的值不会发生改变,也就意味着它们可以通过 hash 算法得到的值时固定的。因此元组可以作为字典的键。这是元组的一个典型应用场景,通常来说,元组用在需要确保数据不会被修改的时候。

参考:
Tuple

复制对象 —— 浅复制和深复制

当我们为变量进行赋值时,只是创建了对对象的引用,而不是将对象进行复制。当将其赋值给另外一个变量时,也并没有复制这个对象,而是复制了引用。

>>> a = 1
>>> id(a)
8109160
>>> b = a
>>> id(b)
8109160                             # 变量 a 和变量 b 指向同一个对象 

使用切片操作和函数进行对象的复制

>>> li = [1, [2, 3]]
>>> a = li[:]                      # 使用切片操作对 li 进行复制
>>> b = list(li)                   # 使用 list() 函数对 li 进行复制
>>> a[0] = 7                    
>>> a
[7, [2, 3]]                        # 修改了 a 的第一个元素
>>> b 
[1, [2, 3]]                        # 并没有对 b 造成改变
>>> a[1][0] = 8
>>> a
[7, [8, 3]]                        # 将 a 中的列表元素中的元素值进行修改
>>> b
[1, [8, 3]]                        # b 中列表元素同样发生了改变

发生上述情况的原因在于浅复制。对一个对象进行浅复制创建了一个新的对象,但对象的内容是对原来对象内容的引用。

>>> id(a[1])
139969576313056
>>> id(b[1])
139969576313056                    # 变量 a 和 b 对应的列表元素指向同一个对象,因此同时发生了改变
>>> id(a[0])
8109016
>>> id(b[0])
8109160                           # 由于数字、字符串等是不可变类型,因此改变该元素即赋值了一个新的对象 

使用浅复制的方法:1)切片操作 [:];2)list()、dict() 等函数;3)使用 copy 模块中的 copy 函数

如果需要得到一个完全不同的复制,需要使用 copy 的 copy.deepcopy() 函数,即深复制

>>> import copy
>>> a = li
>>> b = copy.deepcopy(li)
>>> id(a[1])
139969576313056
>>> id(b[1])
139969576369112                    # a、b 中的列表元素为不同的引用
  • 浅复制和深复制只是针对除元组以外的容器数据类型。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容