Python 2D数组未正确初始化

bihw5rsg  于 2023-10-21  发布在  Python
关注(0)|答案(2)|浏览(125)

我是Python新手,尝试初始化一个像这样的2D数组(仅粘贴代码摘录)

ary = [[0]*cols]*rows

为了插入,我正在做

def Insert(self, val): 
        ary[0][2] = val

在那之后,我像这样插入值:myS.插入(15)
当我尝试使用循环打印数组时,它应该只在索引0,2处打印值15。但它是针对每个索引打印该值,例如。1,2,2,3,2,以此类推

for r in range(self.rows):
        for c in range(self.cols):
            #print (self.sheet[r][c])
            self.col = c
            print ('value at row index ', r, ' col index ', c , ' is ',  self.sheet[r][c])

输出

value at row index  0  col index  0  is  0
value at row index  0  col index  1  is  0
value at row index  0  col index  2  is  15
value at row index  0  col index  3  is  20
value at row index  0  col index  4  is  0
value at row index  1  col index  0  is  0
value at row index  1  col index  1  is  0
value at row index  1  col index  2  is  15
value at row index  1  col index  3  is  20
value at row index  1  col index  4  is  0

你知道我做错了什么吗?是赋值还是循环

izj3ouym

izj3ouym1#

基本上,在python中,对一个元素的列表使用 * 操作符会创建一个以该元素为默认值的列表。
但是在一个完整的列表上使用它会创建指向同一内存地址的列表副本,所以当你改变一行时,你会改变所有的列表,因为它们指向同一个列表。
生成如下:

ary = [[0]*cols for j in range(rows)]

使用列表解析“禁用”了内存地址的复制,而是创建实际的副本。

x8diyxa7

x8diyxa72#

你可以通过使用numpy array来解决这个问题,然后简单地将你的值赋给正确的索引。

import numpy as np

cols = 3
rows = 5
ary = np.zeros((rows, cols))  # create an array of '0' 

ary[0][2] = 15  # what you are interested in

还要注意你的函数名,因为已经有一个原生的insert方法用于列表!
干杯

相关问题