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

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

Topic source

ACKD-东杰

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

根据楼主的tuple学习,做了些练习,发现下面的写法,t里面的list变量没有被重新赋值,请问是为什么呢? 一、定义: list = ['A','B',] t = ('a','b',list) 二、重新赋值给list: list = ['X','Y'] 三、执行t,输出为还是: ('a', 'b', ['A', 'B'])

ACKD-东杰

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

t是存储的是list的值,所以list的引用值变了,也不影响t中存储的list的值。 这样理解么?

廖雪峰

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

理解不对,建议重新读“变量”指向

是不是可以理解成, 第二个list=['',''] 其实并不是给list数组重新赋值 而是重新定义了list数组这个变量 即使在数组里面元素数量相同的情况下 其实也是改变了list这一变量 在tuple中就不会承认这种方法 如果改成 list[0] = 'X' list[1] = 'Y' 那结果就是对的了

cherry冰89

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

这个是不是牵涉到内存垃圾回收机制了。 具体该如何理解,求解啊

cherry冰89

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

好像突然整明白了这个问题。 t = ('a','b',list)这个赋值已经让t指向了内存中list所指向的值即指向了A,B 虽然后来list = ['X','Y']list被重新指向了X,Y。但是t所指向的值并未改变,所以仍然是('a', 'b', ['A', 'B'])。 即,变量都是指向内存中的值,而不是指向某个变量名。

这是个好问题,我也想知道原因?因为print(list)的结果是['X','Y'],我的理解应该list的指向变了的原因吧,这样重新赋值相当于是重新给list分配空间,对于tuple来说就不允许的。

Angdy陈微

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

['A','B'] ['X','Y'] 是指向两个堆内存地址的 你再定义tuple的时候已经指向['A','B']这个内存地址了,指向不可变

还是没能理解为什么直接改l=['X','Y']不行,但是如果改l[0]=['X'],l[1]=['Y']输出的话就可以了,有人能解答一下么?

T_T懂么

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

l=['X','Y'] 因为这种赋值方式,给l用重新分配了新的内存单元去存储x和y的值,而tuple的指向是不变的,也就是说tuple指向list,list指向原来值的内存单元,所以tuple的值不改变。 而l[0]=['X'],l[1]=['Y'] 这种赋值方式,是修改了l[0]和l[1]所指向的内存单元中存储的值。tuple执行list,而list仍然指向这两个内存单元,所以tuple的值跟着改变了。


Reply