>>>t = ('a','b', ['A','B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
这个tuple定义的时候有3个元素,分别是'a'
,'b'
和一个list。不是说tuple一旦定义后就不可变了吗?怎么后来又变了?
别急,我们先看看定义的时候tuple包含的3个元素:
当我们把list的元素'A'
和'B'
修改为'X'
和'Y'
后,tuple变为:
list = ['A','B']t = ('a','b',list)list = ['X','Y']print(t)输出为('a', 'b', ['A', 'B'])
但是
如果是这样的话list = ['A','B']t = ('a','b',list)list[0]='X'print(t)输出为('a', 'b', ['X', 'B'])
这要怎么理解额?
“表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!”
这是廖雪峰老师的原话,说了tuple里的每一个元素指向都不变,list = ['X','Y'] 重新给list分配了地址指向X,Y,但是不会改变t里面list原来的内存地址,原来里面存的是A,B。
要想告诉t他指向的list发生了变化。 一种是list = ['A','B',] t = ('a','b',list)list = ['X','Y']t = ('a','b',list)print(t)
或者像这样,直接告诉t他指向的东西变了list = ['A','B',] t = ('a','b',list)t[2][0]= 'X't[2][1]='Y'print(t)