首页 > 解决方案 > Python [0]*n 语法仅适用于不可变对象?

问题描述

a = [[0]*3] * 4
print(a[0] is a[1]) # True

当我以这种方式初始化一个二维数组时,事情就出错了。我花了一点时间才发现这种意外行为。那么这种语法是否仅适用于不可变对象?

标签: pythonlist

解决方案


它在您的示例中也以它的方式“起作用”。这就是实现list.__mul__解释你想要什么的方式。该列表不能构造新对象,它不知道如何从它包含的任何对象中创建新对象。它通过对这些对象的新引用来扩展自身。

你会得到与不可变整数相同的行为

>>> x = [0] * 3
>>> x[0] is x[1]
True

你可以得到二维数组

>>> a = [[0]*3 for _ in range(4)]
>>> a[0] is a[1]
False

你想要什么的原因[0] * 3是它正在创建包含 3 个对同一 immutable 的引用的列表0


推荐阅读