why can't I change only a single element in a nested list in Python [duplicate]

南笙酒味 提交于 2019-11-26 04:55:53

问题


I just met something really strange of 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]]

well, obviously, what I want is :

[[0, 9, 0], [0, 0, 0], [0, 0, 0]]

isn\'t strange? I\'m not very familiar with Python, but Python always impresses me with its intuitive behavior. But how it comes up with this?
... and how can I get what I need?

thanks!

Watt


回答1:


A strange behaviour indeed, but that's only because * operator makes shallow copies, in your case - shallow copies of [0, 0, 0] list. You can use the id() function to make sure that these internal lists are actually the same:

out=[[0]*3]*3
id(out[0])
>>> 140503648365240
id(out[1])
>>> 140503648365240
id(out[2])
>>> 140503648365240

Comprehensions can be used to create different lists as follows:

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



回答2:


Using * to duplicate elements in lists is a shallow copy operation, so you will end up with multiple references to the same mutable objects if you use this on a list that contains mutable objects.

Instead, use the following to initialize your nested list:

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

You can see that with your method, each entry in out is actually a reference to the same list, which is why you see the behavior that you do:

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


来源:https://stackoverflow.com/questions/10941032/why-cant-i-change-only-a-single-element-in-a-nested-list-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!