元组不可变的前提是元组内只能包含单一元素,例如:字符串、数字等
但当元组中包含数组时,元组中的数组内容时可更改的,且元组的id未改变。
这意味着元组的内容可变,当然,这实际还是改变的是数组的值。
T =('google',[0,1,2,3,4])
print(id(T), T)
T[1][0]=99
print(id(T), T)
输出:
3212880643136('google',[0,1,2,3,4])
3212880643136('google',[99,1,2,3,4])
元组的装包与拆包
Python中,元组装包拆包是自动的,不需要任何函数,导致很多人对于函数返回值一会有括号一会没括号非常迷惑
先看代码:
a=1,2,3
#它其实等价于下面的代码
a=(1,2,3)
#因为等号左边只有1个变量,而等号右边有3个值,因此自动装包成为一个元组
再看下面的代码:
a,b,c=(1,2,3)
#自动拆包,得到a=1,b=2,c=3
当函数return的时候,其实只能return一个值,并不能return多个值
有人会问,我return了多个值也没有报错啊,运行很正常
那正是因为Python将多个返回值自动装包造成的
因此当你返回多个变量,而外面只用一个变量去接收,会接收到一个元组
而当你用多个变量去接,就能对应的接收到每个值,这是因为自动拆包
理解了这一点,对于理解函数返回值、字典中的键值对等等都是有帮助的
=========================================================
为了加强理解,再看最后一组代码:
a=10
b=20
a,b=b,a,1
执行会报错:too many values to unpack
这里很明显的,告诉你元组里有3个值需要拆包,而你只用2个值去接收,证明了元组确实执行了一个拆包的动作