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

python列表-在特定列表位置更改值会在多个位置错误地反映出来,python,list,pass-by-reference,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]] ] 预期(分配后): 实际(分配后):

在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]]*(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.
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.