python list - 更改特定列表位置的值会在多个位置错误地反映出来

时间:2017-03-06 09:53:57

标签: python list pass-by-reference

在python中,我试图将整数分配给列表中的特定位置。但是,该值将分配给所有多个位置。显然,python是通过引用而不是值来赋值,但为什么呢?

matrix = [[[0,0]] * (5) for _ in range(2)]
matrix[1][3][0] = 42

初始

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

预期(分配后):

[
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 
[[0, 0], [0, 0], [0, 0], [42, 0], [0, 0]]
]

实际(分配后):

[
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 
[[42, 0], [42, 0], [42, 0], [42, 0], [42, 0]]
]

1 个答案:

答案 0 :(得分:-1)

罪魁祸首是[[0,0]] * (5)。这个懒惰的家伙只创建一个元素[0,0]并复制其引用5次以生成整个列表。当我尝试将值设置为特定的索引位置时,很高兴地假设它是一个原子操作,由于引用,相同的值会在不同的位置弹出。

创建矩阵的正确陈述应为:

matrix = [[[0,0] for __ in range(5)] for _ in range(2)]

理想情况下,*运算符只能用于创建原子值列表,如整数和字符。不用于创建列表或其他对象列表。

x = [4]*100 # will create a list of number 4 repeated 100 times.
y = [x]*100 # will create a list with reference of x repeated 100 times. Any change in x will be visible in y and vice-versa.