python列表的一个元素更改,导致整个列元素更改

时间:2019-12-03 04:14:29

标签: python

当我使用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]]时 结果是正确的。

2 个答案:

答案 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))

这使您不必为每个行显式分配值。希望能帮助到你。