Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么f=g=h=[]将列表设置为永远相等?_Python_Python 3.x_List - Fatal编程技术网

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