arrays - 为什么嵌套数组在python中复制其元素?
问题描述
看看这段代码
a=[[0]*3]*3
a[1][1]=1
for x in a:
print(*x)
#output
# 0 1 0
# 0 1 0
# 0 1 0
看看这段代码
a=[
[0,0,0],
[0,0,0],
[0,0,0]
]
a[1][1]=1
for x in a:
print(*x)
#output
# 0 0 0
# 0 1 0
# 0 0 0
我相信在这两种情况下,数组 a 是相同的。但是为什么结果不一样呢。
解决方案
在第一个示例中,您正在创建一个列表,然后将其复制三遍。所以每个副本都指向原始列表,我们可以通过打印对象的 id 来看到这一点。
a=[[0]*3]*3
a[1][1]=1
for x in a:
print(id(x))
#OUTPUT
2330620420744
2330620420744
2330620420744
在第二个示例中,您创建 3 个单独的列表
a=[
[0,0,0],
[0,0,0],
[0,0,0]
]
a[1][1]=1
for x in a:
print(id(x))
#OUTPUT
2330620420680
2330648632008
2330653113224
如果你想创建一个这样的二维列表,你可以使用 range 函数来创建 x 多个列表。
a = [[[0] for _ in range(3)] for _ in range(3)]
a[1][1] = 1
for x in a:
print(id(x))
#OUTPUT
2475065760136
2475067183944
2475067184328
推荐阅读
- visual-c++ - 如何在不舍入小数点值的情况下获得精确的小数精度值?
- javascript - 如何使用 dojo 从 innerText 或 InnerHTML 获取字符数?
- javascript - 为什么不能直接从 Fetch API 的响应中访问 JSON?
- javascript - javascript变量在原始变量更改后更改值
- caching - 如何在flutter中使用precacheImage函数?
- google-cloud-platform - 在长时间运行的 Cloud PubSub 订阅者服务中捕获侦听器异常
- python - 如何添加一个将 yticks 划分为几个类别并在 matplotlib 中提供这些类别的标签的栏?
- rest - 如何使用 sharepoint online REST API 在特定文件夹中搜索项目并获取其属性?
- python - 按日期和另一列值过滤 Pandas df
- r - 如何将 DF 转换为时间序列对象