Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.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中,我只更改嵌套列表中的一个元素_Python_Nested Lists - Fatal编程技术网

为什么可以';在Python中,我只更改嵌套列表中的一个元素

为什么可以';在Python中,我只更改嵌套列表中的一个元素,python,nested-lists,Python,Nested Lists,我刚刚遇到了一些非常奇怪的Python: >>> out=[[0]*3]*3 >>> out [[0, 0, 0], [0, 0, 0], [0, 0, 0]] >>> out[0][1] 0 >>> out[0][1]=9 >>> out [[0, 9, 0], [0, 9, 0], [0, 9, 0]] 显然,我想要的是: [[0, 9, 0], [0, 0, 0], [0, 0, 0]] 这不奇怪

我刚刚遇到了一些非常奇怪的Python:

>>> out=[[0]*3]*3
>>> out
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> out[0][1]
0
>>> out[0][1]=9
>>> out
[[0, 9, 0], [0, 9, 0], [0, 9, 0]]
显然,我想要的是:

[[0, 9, 0], [0, 0, 0], [0, 0, 0]]
这不奇怪吗?我对Python不是很熟悉,但Python总是以其直观的行为给我留下深刻印象。但是它是如何得出这个结论的呢?
... 我怎样才能得到我需要的

谢谢


瓦特

使用
*
复制列表中的元素是一种浅层复制操作,因此,如果在包含可变对象的列表中使用此操作,则最终将得到对相同可变对象的多个引用

相反,请使用以下命令初始化嵌套列表:

out = [[0]*3 for _ in range(3)]
您可以看到,使用您的方法,
out
中的每个条目实际上都是对同一列表的引用,这就是为什么您会看到您所做的行为:

>>> out = [[0]*3]*3
>>> out[0] is out[1] is out[2]
True

这的确是一种奇怪的行为,但这只是因为
*
操作符生成了浅拷贝,在您的例子中是
[0,0,0]
列表的浅拷贝。您可以使用
id()
函数来确保这些内部列表实际上是相同的:

out=[[0]*3]*3
id(out[0])
>>> 140503648365240
id(out[1])
>>> 140503648365240
id(out[2])
>>> 140503648365240
理解可用于创建不同的列表,如下所示:

out = [ [0]*3 for _ in range(3) ]

有一件事你是对的——这不是很直观。我认为他们在Python3中也没有修复它。@MarkRansom为什么您认为它需要修复?如果你真的想要这种行为,如果它被改变了怎么办?如果有人想知道人们是否在代码中正确使用这种行为,请参阅上的文档,其中有一个使用
zip(*[iter(s)]*n)
将序列聚类成n个长度组的示例。是的,问题只在于第一行。卡尔克内切特尔,我的第一个想法是“哦,不,别再这样了。”有时候,找到重复的东西太麻烦了。