首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更改列表字典中的一个python列表会更改所有列表。

更改列表字典中的一个python列表会更改所有列表。
EN

Stack Overflow用户
提问于 2012-12-07 20:36:17
回答 2查看 132关注 0票数 1

可能重复: Two separate python lists acting as one

这段代码创建了一个列表字典,其中键位于usens中。列表中满是0

代码语言:javascript
运行
复制
usens = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 110, 111, 112, 113, 114,
         115, 116, 117, 118, 119, 302, 303, 306, 307, 308, 370, 371, 500,
         501, 1000, 1010, 1020, 1100, 1200, 1201, 1202, 2000, 2001, 2002
         ]
empty = [[0]*length]*len(usens)
data = dict(zip(usens, empty))
pprint.pprint(data, indent=5)

data[0][0] += 1
pprint.pprint(data, indent=5)

第一个漂亮的打印返回预期的(删除的blurb):

代码语言:javascript
运行
复制
{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]}

然后我这样做:data[0][0] += 1,期望(索引0)的第一个列表以1开头,但没有任何其他改变。

然而,所有的清单都已修改:

代码语言:javascript
运行
复制
{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]}

为什么,以及如何使它只修改一个列表?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-07 20:40:52

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

试试empty = [[0]*length for i in range(len(usens))]

票数 3
EN

Stack Overflow用户

发布于 2012-12-07 20:48:13

使用*可以创建副本;对于[0]来说可以,因为它在复制不可变的标量;但是外部*创建相同列表的副本(即复制引用)。你可以使用这样的东西:

代码语言:javascript
运行
复制
empty = [0]*5
data = {n:list(empty) for n in usens}

创建列表(如果使用Python 2.7+)。使用list制作一个副本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13770585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档