我尝试在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)
我或我的代码有什么问题?
答案 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)]