在Python 3中创建一个随机空白矩阵(2D数组)?

时间:2014-07-29 18:20:44

标签: python python-3.x matrix multidimensional-array

我尝试在python 3中创建一个随机空白矩阵而不使用numpy。 代码看起来很完美,但是当我更改单个单元格的值(例如Square 1 [0])时,它会更改所有Square 1 [x]值。

#!/usr/bin/env python3

# Creating a random n*n blank matrix
#for example 6*6

#I'll just create coloumns
def one():

    square = []
    for x in range(6):
        square.append(None)

    Square = []
    for x in range(6):
        Square.append(square)

    return Square

#output is exactly what i want
print(one())

#but when i try to change a single value(cell),

a = one()

a[2][2] = "Error"

#it's bullshit
print(a)

我或我的代码有什么问题?

2 个答案:

答案 0 :(得分:1)

Square是六个引用的列表,所有引用都指向相同的square列表。修改任何这些square引用都将影响所有行。您可以通过查看行的id值来确认这一点:

a = one()
print id(a[0])
print id(a[1])

结果:

37725768
37725768

不是制作一个square并将其追加六次,而是制作六个square并将每个def one(): Square = [] for y in range(6): square = [] for x in range(6): square.append(None) Square.append(square) return Square 追加一次。

a = one()
print id(a[0])
print id(a[1])
#result:
#37827976
#37829192

现在行将全部引用不同的列表。

square

我还建议更改def make_matrix(): matrix = [] for y in range(6): row = [] for x in range(6): row.append(None) matrix.append(row) return matrix 的名称,因为有两个变量名称只有大小写不同,这是非常令人困惑的。

{{1}}

答案 1 :(得分:1)

您的代码失败,因为您将6个引用附加到同一个数组。有关更详细的解释,请参阅凯文的答案。

更多" pythonic"创建数组的方法:

array = [[None]*n for x in range(n)]

这使用list comprehension