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 中的一样,但不是出于某种原因。

【问题讨论】:

第一种情况下的浅拷贝? 请注意,这些是 Python lists,而不是数组。在 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数组奇怪的行为? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

默认复制/移动构造函数时 GDB 中的奇怪行为

DataFrame复制的奇怪行为[重复]

无法将数组的内容复制到另一个数组中......得到奇怪的数字

如何强制 Python 在循环内创建新变量/新范围? [复制]

std::initializer_list 下的数组的生命周期是多少? [复制]

奇怪的行为:列表理解中的 Lambda