python - Python [0]*n 语法仅适用于不可变对象?
问题描述
a = [[0]*3] * 4
print(a[0] is a[1]) # True
当我以这种方式初始化一个二维数组时,事情就出错了。我花了一点时间才发现这种意外行为。那么这种语法是否仅适用于不可变对象?
解决方案
它在您的示例中也以它的方式“起作用”。这就是实现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
。
推荐阅读
- c# - C# Mvc CurrentCulture 异步问题,加载了错误的语言
- dictionary - 使用元组在 Julia 中有键而不初始化字典
- ruby-on-rails - 样式表在 render_to_string 准备页面时未加载 wicked_pdf
- elasticsearch - 将弹性搜索查询 + 聚合转换为嵌套语法
- android - Android 如何使用来自其他 XML 文件的控件
- java - Eclipse:无法创建 SWT 浏览器小部件
- c# - 在 c:\bin\roslyn 生成的 Roslyn bin 文件夹
- ip-address - 如何表示未指定的 IPv4 地址?
- jmeter - 使用Jmeter在生产环境中进行性能测试
- reactjs - 出现错误:在可拖动中添加 isDragDisabled 标志时在可拖动中找到拖动句柄元素