Discuss / Python / 关于tuple里面list的赋值问题?

关于tuple里面list的赋值问题?

Topic source

_swayer

#42 Created at ... [Delete] [Delete and Lock User]

第二次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]))

一、定义: 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']一直没变。

我这样理解: tuple中的list相当于一个“中介”,引导tuple找到最终的内存位置,之后和tuple不再有关系。

DEMO_14

#45 Created at ... [Delete] [Delete and Lock User]

可以参考之前的 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)

老哥稳002

#48 Created at ... [Delete] [Delete and Lock User]

python中的变量都是临时变量 你这样写相当于是创建了一个新的list 教程中有写元组指向的list是不能变的

并不复杂, t 指向的是list这个变量里的字符串'A'和'B' t = ('a','b',list) 使用变量, 永远是指向变量里的数据, 而不是变量本身 t = ('a','b','A','B',)


Reply