首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python列表

Python列表
EN

Stack Overflow用户
提问于 2012-10-21 02:02:16
回答 4查看 352关注 0票数 6

可能重复: Python列表中的意外特性

我想用Python列出一个列表,但显然这是行不通的,因为更改一个数字会改变几个。为什么会这样,我该怎么解决呢?

代码语言:javascript
复制
>>> a = [[0]*3]*4
>>> a[0][0] = 1
>>> a
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-21 02:07:31

你发现的是一个经典Python陷阱

x = [0]*3是一个列表。没有问题,但是[x]*4创建了一个列表,其中包含了对完全相同的列表x的4个引用。因此,修改第一个元素,x,也会修改其他元素。

相反,如果您这样做:

代码语言:javascript
复制
In [193]: a = [[0]*3 for i in range(4)]

然后在列表中得到4个不同的项目:

代码语言:javascript
复制
In [194]: a[0][0] = 1

In [195]: a
Out[195]: [[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
票数 8
EN

Stack Overflow用户

发布于 2012-10-21 02:12:04

在Python中,[x]*n创建一个新列表,其中包含对xn引用。如果x是不可变的(字符串、元组等),这是非常好的,但是如果x是可变的,则会变得相当混乱,因为对一个元素的更改会影响x,因此似乎会影响列表中的所有元素。

因此,解决方案是使用列表理解来创建n新事物:

代码语言:javascript
复制
[x for _ in xrange(n)] # we use _ here as a "dummy variable"

在你的例子中,看起来就像

代码语言:javascript
复制
a = [[0]*3 for _ in xrange(4)]
票数 4
EN

Stack Overflow用户

发布于 2012-10-21 02:08:25

不要使用*。使用列表理解并创建如下所示:

代码语言:javascript
复制
>>> a = [[0 for i in range(3)] for j in range(4)]
>>> a[0][0] = 1
>>> a
[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

更好的解释见unutbu和nneonneo的答案。

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

https://stackoverflow.com/questions/12994303

复制
相关文章

相似问题

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