在列表字典中更改一个python列表会更改所有列表

在列表字典中更改一个python列表会更改所有列表,python,list,dictionary,Python,List,Dictionary,可能重复: 这段代码创建了一个列表字典,其中的键正在使用中。清单上全是0 第一个漂亮的打印返回预期删除的模糊: {0: [0, 0, 0, 0, 0], 1: [0, 0, 0, 0, 0], 2: [0, 0, 0, 0, 0], 3: [0, 0, 0, 0, 0], 4: [0, 0, 0, 0, 0], 5: [0, 0, 0, 0, 0], ..... 2001: [0, 0, 0, 0, 0], 2002: [0, 0, 0, 0, 0]} 然后我这样做:数据[0

可能重复:

这段代码创建了一个列表字典,其中的键正在使用中。清单上全是0

第一个漂亮的打印返回预期删除的模糊:

{0: [0, 0, 0, 0, 0],
 1: [0, 0, 0, 0, 0],
 2: [0, 0, 0, 0, 0],
 3: [0, 0, 0, 0, 0],
 4: [0, 0, 0, 0, 0],
 5: [0, 0, 0, 0, 0],
 .....
 2001: [0, 0, 0, 0, 0],
 2002: [0, 0, 0, 0, 0]}
然后我这样做:数据[0][0]+=1,期望索引0的第一个列表以1开头,但其他内容不变

但是,所有列表都已修改:

{0: [1, 0, 0, 0, 0],
 1: [1, 0, 0, 0, 0],
 2: [1, 0, 0, 0, 0],
 3: [1, 0, 0, 0, 0],
 4: [1, 0, 0, 0, 0],
 .....
 2001: [1, 0, 0, 0, 0],
 2002: [1, 0, 0, 0, 0]}
为什么,以及如何使其仅修改一个列表?

empty=[[0]*length]*lenusens将创建相同列表的lenusens副本,这与具有相同内容的lenusens列表不同

尝试清空=[[0]*length for i in rangelenusens]。

清空=[[0]*length]*lenusens将创建相同列表的lenusens副本,这与具有相同内容的lenusens列表不同

尝试清空=[[0]*范围内i的长度]。

使用*创建副本;对于[0],这没问题,因为它复制的是一个不可变的标量;但外部*创建相同列表的副本,即复制引用。您可以使用以下内容:

empty = [0]*5
data = {n:list(empty) for n in usens}
如果使用Python2.7+,创建列表的dict理解。使用列表创建副本。

使用*创建副本;对于[0],这没问题,因为它复制的是一个不可变的标量;但外部*创建相同列表的副本,即复制引用。您可以使用以下内容:

empty = [0]*5
data = {n:list(empty) for n in usens}

如果使用Python2.7+,创建列表的dict理解。使用列表创建副本。

可能的副本,也可以查看,可能的副本,也可以查看,实际上,使用*不会创建副本。问题在于缺少拷贝。你对同一个列表有很多引用,而不是你认为你得到的副本。这取决于你如何使用copy这个词。它创建引用的副本;没有与copy.deepcopy相同的值副本的不同引用。不过,如果他说有多个参考资料,可能会更清楚。事实上,使用*不会创建副本。问题在于缺少拷贝。你对同一个列表有很多引用,而不是你认为你得到的副本。这取决于你如何使用copy这个词。它创建引用的副本;没有与copy.deepcopy相同的值副本的不同引用。不过,如果他说了多个参考资料,可能会更清楚。