Python 为什么f=g=h=[]将列表设置为永远相等?
为什么Python 为什么f=g=h=[]将列表设置为永远相等?,python,python-3.x,list,Python,Python 3.x,List,为什么 f = g = h = [] f.append(1) 制造 ? 为什么列表是这样链接的?如果我对整型变量也这么做,它们就不会被链接 []在特定位置创建列表 然后,将f指向该位置 然后,将g也指向该位置。和h 很自然地,当您在适当的位置修改该列表(而不更改其引用)时,指向它的所有内容都将看到更改 您说更改整数不会产生这种效果。那是因为这是一种不同类型的改变。python中的整数是不可变的,通常不能就地更改-相反,必须创建一个新的整数(同时创建一个新的引用),然后将其分配给查看旧整数的名
f = g = h = []
f.append(1)
制造
?
为什么列表是这样链接的?如果我对整型变量也这么做,它们就不会被链接
[]
在特定位置创建列表
然后,将f
指向该位置
然后,将g
也指向该位置。和h
很自然地,当您在适当的位置修改该列表(而不更改其引用)时,指向它的所有内容都将看到更改
您说更改整数不会产生这种效果。那是因为这是一种不同类型的改变。python中的整数是不可变的,通常不能就地更改-相反,必须创建一个新的整数(同时创建一个新的引用),然后将其分配给查看旧整数的名称:
h = 5
id(h)
# 4318792464
h = 6
id(h)
# 4318792496
# note that these two addresses are different, meaning different locations.
如果这意味着旧值将永远丢失,那么垃圾收集器最终将清理它并释放它所占用的内存
如您所见,就地修改列表不会更改其引用:
f = g = []
id(f) == id(g)
# True
g.append(1)
id(f) == id(g)
# still True
g = [1] # make a new list at a different location, with the same value
f == g
# True
id(f) == id(g)
# False
当你使用任何东西(第一种写作风格)进行写作时,它们都会被链接起来,因为
f
,g
,h
指向[]
。当您在适当的位置对任何变量进行变异时,更改将反映在所有变量中。而int
是不可变的数据类型。所以,一旦你改变了值,它就会指向不同的对象f.append(1)
和f=2
是两个完全不同的操作。这是一个常见问题。请参阅的“回答好的问题”部分,特别是关于“以前被问过多次并回答过多次”的问题的要点。您的顺序错误,f
首先被分配,而不是h
。
f = g = []
id(f) == id(g)
# True
g.append(1)
id(f) == id(g)
# still True
g = [1] # make a new list at a different location, with the same value
f == g
# True
id(f) == id(g)
# False