当我使用list_1=[[0]*5]*10
来创建列表时。pythonlist的一个元素发生更改,导致整个列元素都发生了更改。
但是当我使用list_1=[[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,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]
进行列表时,没有错。为什么?
我的代码:
import random
import csv
rows = 10
cols = 5
list_1 = [[0]*cols]*rows #This is wrong.
#list_1 = [[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,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]] #This is right.
for i in range(rows)
a=random.randint(1,100)
b=random.randint(1,100)
c=random.randint(1,100)
d=random.randint(1,100)
e=random.randint(1,100)
list_1[i][0] = a
list_1[i][1] = b
list_1[i][2] = c
list_1[i][3] = d
list_1[i][4] = e
print(list_1)
当我使用list_1 = [[0]*cols]*rows
时,结果是:
[[12,25,0,1,0],
[12,25,0,1,0],
[12,25,0,1,0],
[12,25,0,1,0],
[12,25,0,1,0],
[12,25,0,1,0],
[12,25,0,1,0],
[12,25,0,1,0],
[12,25,0,1,0],
[12,25,0,1,0]]
所有行都相同。但是当我使用list_1=[[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,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]
时
结果是正确的。
答案 0 :(得分:4)
请考虑以下简单示例以了解
:li = [[]] * 3
print(li)
# Out: [[], [], []]
乍一看,我们认为我们有一个包含3个不同嵌套列表的列表。让我们尝试将1附加到第一个:
li[0].append(1)
print(li)
# Out: [[1], [1], [1]]
原因是[[]] * 3不会创建3个不同列表的列表。而是,它创建一个列表,其中包含对同一列表对象的3个引用。这样,当我们附加到li [0]时,该变化在li的所有子元素中可见。这等效于:
li = []
element = [[]]
li = element + element + element
print(li)
# Out: [[], [], []]
element.append(1)
print(li)
# Out: [[1], [1], [1]]
参考:https://riptutorial.com/python/example/12259/list-multiplication-and-common-references
答案 1 :(得分:0)
Sapan Zaveri的答案很好地解释了为什么会发生这种情况。
对此的一种解决方案:
import csv
rows = 10
cols = 5
list_1 = []
for i in range(rows):
a = []
for j in range(cols):
a.append(random.randint(1,100))
list_1.append(a)
print((list_1))
这使您不必为每个行显式分配值。希望能帮助到你。