Python 的元组与列表类似,不同之处在于元组的元素不能修改。
Python基本数据类型--元组
面试时,经常被问,列表与元组之间等区别是什么?相信学完Python 基础(列表)的读者,很快能想到列表是可变数据类型,而本期学的元组是不可变数据类型。具体来看看是怎么回事吧!
将字符串转化为元组
>>> st = '数据STUDIO'
>>> tup = tuple(s)
>>> tup
('数', '据', 'S', 'T', 'U', 'D', 'I', 'O')
>>> type(tup)
tuple
将列表转化为元组
>>> L = ['关注', '点赞', '转发', '在看', '收藏', '数据STUDIO']
>>> tup = tuple(L)
>>> tup
('关注', '点赞', '转发', '在看', '收藏', '数据STUDIO')
>>> type(tup)
tuple
>>> tup = ('关注', ['点赞', '转发', '在看'], '收藏', '数据STUDIO')
>>> tup
('关注', ['点赞', '转发', '在看'], '收藏', '数据STUDIO')
>>> type(tup)
tuple
按照常规思维定义,括号内是什么类型,结果仍是什么类型,括号相当于摆设。
>>> tup = (520)
>>> t
520
>>> type(t)
int
>>> tup = ('DATA STUDIO')
>>> tup
'DATA STUDIO'
>>> type(t)
str
>>> tup = (['点赞', '转发', '在看'])
>>> tup
['点赞', '转发', '在看']
>>> type(t)
list
只含有一个元素的元组的定义,后面必须加一个逗号
>>> tup = (520,)
>>> t
(520,)
>>> type(t)
tuple
>>> tup = ('DATA STUDIO',)
>>> tup
('DATA STUDIO',)
>>> type(t)
tuple
>>> tup = (['点赞', '转发', '在看'],)
>>> tup
(['点赞', '转发', '在看'],)
>>> type(t)
tuple
把元祖的元素全部添加到一个新的元祖当中,原元组不变
>>> a = (1, 2, 3)
>>> b = (4, 5, 6)
>>> a+b
(1, 2, 3, 4, 5, 6)
重复元祖当中的元素
>>> ('点赞', '关注')*3
('点赞', '关注', '点赞', '关注', '点赞', '关注')
判断元素是否在元祖当中
>>> tup = ('关注', '转发', '在看', '收藏', '数据STUDIO')
>>> '点赞' in tup
False
# 如果文章对您有帮助,记得文末点赞支持哟
>>> tup = (['关注', '点赞'], '转发', '在看', '收藏', '数据STUDIO')
>>> ['关注', '点赞'] in tup
True
这里和列表是一模一样的,没有任何区别
>>> tup = ('life', 'is', 'short', 'I', 'use', 'python')
>>> tup
('life', 'is', 'short', 'I', 'use', 'python')
#取出索引为0的元素
>>> tup[0]
'life'
#取出倒数第一个元素
>>> tup[-1]
'python'
之前说了元组是不可变数据类型,那么他就没有增 删 改
的方法,相比列表就少了很多。如果需要修改,可先转化为列表,通过列表进行修改,再转变成元组。
>>> tup1 = ('关注', '转发','点赞', '点赞', '在看', '收藏', '点赞', '数据STUDIO')
>>> tup1
>>> tup1.count('点赞')
3
>>> tup1 = ('关注', '转发','点赞', '点赞', '在看', '收藏', '点赞', '数据STUDIO')
>>> tup1
>>> tup1.index('点赞')
2
>>> tup1 = ('关注', '转发','点赞', '点赞', '在看', '收藏', '点赞', '数据STUDIO')
>>> tup1.index('点赞',4,6) # 找不到就报错
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-26-89be7a0f36f3> in <module>
1 tup1 = ('关注', '转发','点赞', '点赞', '在看', '收藏', '点赞', '数据STUDIO')
----> 2 tup1.index('点赞',4,6)
ValueError: tuple.index(x): x not in tuple
>>> tuple1 = (5, 2, '点赞', ['人生', '苦短', '我关注数据STUDIO'])
>>> tuple1
(5, 2, '点赞', ['人生', '苦短', '我关注数据STUDIO'])
>>> tuple1[1] = 1 # 元组是不可变数据类型
---------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-28-847323afb01c> in <module>
----> 1 tuple1[1] = 1
TypeError: 'tuple' object does not support item assignment
>>> tuple1[3][0]='life'
>>> tuple1
(5, 2, '点赞', ['life', '苦短', '我关注数据STUDIO'])
#为什么这里没有报错, 且元组tuple1改变了....
元组的不可变是指,元组本身自己的元素不可变,同理列表可变是指列表自己本身的元素可变。
>>> tuple2 = ('点赞', '关注', ['公众号', '数据STUDIO'])
>>> tuple2
('点赞', '关注', ['公众号', '数据STUDIO'])
>>> tuple2[2][0] = '转发'
>>> tuple2[2][1] = '在看'
>>> tuple2
('点赞', '关注', ['转发', '在看'])
>>> tuple2[2].append('jim_learning')
>>> tuple2
('点赞', '关注', ['转发', '在看', 'jim_learning'])
tuple2
内存示意图
当把list
的元素'公众号'和 '数据STUDIO'
修改为'转发', '在看'
后, tuple2
变为:
表面上看,
tuple2
的元素好像变了,但其实变得不是tuple
的元素而是list
的元素。tuple2
开始指向的list
并没有改成别的list
,所以tuple2
所谓的"不变"
是指,tuple
的每个元素,指向永远不变。即指向'点赞'
,就不能改成指向'关注'
,指向一个list
,就不能改成指向其他对象,但指向的这个list
本身是可变的!