Python数组奇怪的行为? [复制]
Posted
技术标签:
【中文标题】Python数组奇怪的行为? [复制]【英文标题】:Python array strange behavior? [duplicate] 【发布时间】:2016-10-27 08:13:39 【问题描述】:谁能解释为什么会这样?
案例一:
>>> a = [[0]] *3
>>> print a
[[0], [0], [0]]
>>> a[1].append(0)
>>> print a
[[0, 0], [0, 0], [0, 0]]
案例 2:
>>> a = [[0],[0],[0]]
>>> print a
[[0], [0], [0]]
>>> a[1].append(0)
>>> print a
[[0], [0, 0], [0]]
为什么会这样?我期望在案例 1 中数组的行为与案例 2 中的一样,但不是出于某种原因。
【问题讨论】:
第一种情况下的浅拷贝? 请注意,这些是 Pythonlist
s,而不是数组。在 Python 的上下文中,array
通常被解释为表示 NumPy 数组(尽管还有一个标准库 array
模块)。
【参考方案1】:
在第一种情况下,您正在创建一个列表 [0]
并将其复制 3 次。这是重复三次的同一个对象。你应该只使用不可变类型的星形形式
为避免在您拥有可变类型时出现此问题,请使用列表推导:
a = [[0] for _ in range(3)]
【讨论】:
【参考方案2】:在第一种情况下,a
中的三个元素实际上引用了相同的列表对象。你可以查看他们的id:
>>> id(a[0])
4524132472
>>> id(a[1])
4524132472
>>> id(a[2])
4524132472
【讨论】:
或者,(a[0] is a[1]) == True
以上是关于Python数组奇怪的行为? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
无法将数组的内容复制到另一个数组中......得到奇怪的数字
如何强制 Python 在循环内创建新变量/新范围? [复制]