首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python2D列表填充

Python2D列表填充
EN

Stack Overflow用户
提问于 2020-04-17 02:53:51
回答 2查看 37关注 0票数 0

刚开始使用python,在填充列表时遇到了困难。

代码语言:javascript
复制
mat = [[0]*3]*4

for i in range(4):
  for j in range(3):
    mat[i][j] = (i,j)

print(mat)

上面的代码打印出来:

代码语言:javascript
复制
[[(3, 0), (3, 1), (3, 2)],
 [(3, 0), (3, 1), (3, 2)],
 [(3, 0), (3, 1), (3, 2)],
 [(3, 0), (3, 1), (3, 2)]]

当我认为它应该打印出这样的东西:

代码语言:javascript
复制
[[(0, 0), (0, 1), (0, 2)],
 [(1, 0), (1, 1), (1, 2)],
 [(2, 0), (2, 1), (2, 2)],
 [(3, 0), (3, 1), (3, 2)]]

我意识到这可能是一个简单的问题,但我做错了什么?Everywhere online告诉我以这种方式填充列表。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-17 02:59:16

当您创建原始数组时,矩阵的某些部分共享相同的引用:mat[0] is mat[1],=>,True!这将创建相同的数组,并重复对其的4个引用:[[0]*3]*4,因此,当您更改一个数组时,您将全部更改它们。

避免这种情况的一种方法是创建子数组:

代码语言:javascript
复制
mat = []

for i in range(4):
    mat.append([])
    for j in range(3):
        mat[i].append((i,j))

print(mat)
# [[(0, 0), (0, 1), (0, 2)], [(1, 0), (1, 1), (1, 2)], [(2, 0), (2, 1), (2, 2)], [(3, 0), (3, 1), (3, 2)]]
票数 3
EN

Stack Overflow用户

发布于 2020-04-17 03:03:06

代码语言:javascript
复制
mat = [[0]*3]*4.
mat[0][1] = 1

print(mat)

如您所见,数组的所有行都已更改为与初始值匹配。这是因为在python中,创建列表的方式复制了相同的原始行,这意味着所有其他行都将指向相同的内存地址,因此它们都会受到影响。

若要解决此问题,请尝试以下操作:

代码语言:javascript
复制
mat=[[0]*3 for i in range(4)]

这使得列表中的所有内容都是独立的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61263374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档