关于tuple里面list的赋值问题?
Topic source一、定义: list = ['A','B'] t = ('a','b',list) 翻译: 定义一个集合['A','B'],然后用变量list指向该集合。 【关键是理解集合和变量。变量只能指来指去,变量本身没有内容。】定义一个元组('a','b',['A','B']),然后将变量t指向该元组
二、重新赋值给list: list = ['X','Y'] 翻译: 定义一个集合['X','Y'],然后用变量list指向该集合。
三、执行t, 翻译: 输出t,因为变量t指向的内容没变。所以输出的仍然是('a','b',['A','B'])
更改1:
t = ('a', 'b', ['A', 'B']) t[2][0] = 'X' t[2][1] = 'Y' t ('a', 'b', ['X', 'Y']) 这是因为t[2][0] = 'X'先把['A', 'B']变成了['X', 'B'] 更改2: list = ['A','B'] t = ('a','b',list) list = ['X','Y'] list[0]=‘Z’ t 还是得到('a', 'b', ['A', 'B']),因为搞来搞去,集合['A','B']一直没变。
可以参考之前的 a = 100 b = a a = 200 输出 b 的值仍为100。 t[2] 始终指向不变的是之前定义好的 list 存放值的地址,而不是该地址的值。所以可以随便改变地址里存放的值。再次输出 t 时,t 找这个地址取值。 而之后相当于再定义个 list ,新开辟了地址来存放(我认为之前的list地址被t指向了,所以不会回收)。所以这时打印 t 不会指向新地址取值。
coding: utf-8
list = ['A','B'] print(id(list)) t = ('a','b',list) print(id(t[2])) list = ['X','Y'] print(id(list)) list[0]='a' list[1]='b' print(id(list))
可以运行一下这个代码,查验。
“表面上看,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)
并不复杂, t 指向的是list这个变量里的字符串'A'和'B' t = ('a','b',list) 使用变量, 永远是指向变量里的数据, 而不是变量本身 t = ('a','b','A','B',)
_swayer
第二次list = ['x','y'],只是重新改变了list的指向,但是元祖T中存放的依然是第一次list=['A','B']的指向。执行下面代码你就明白了。
testlist = ['A','B',] t = ('a','b',testlist)
print("当前t元祖数据 --> " , t) print("当前testlist数据 id : " , id(testlist) , "\ttestlist value :","".join(testlist)) print("当前t元祖数据中testlist的id --> ",id(t[2]))
testlist = ['x','y']
print("执行testlist = ['x','y']之后....")
print("当前t元祖数据 --> " , t) print("当前testlist数据 id : " , id(testlist) , "\ttestlist value :","".join(testlist)) print("当前t元祖数据中testlist的id --> ",id(t[2]))