这两种二维数组初始化方式之间的主要区别是什么
m1 = [[0]*5]*5
m2 = [[0 for x in range(5)]for y in range(5)]
此代码为我在打印结果时提供了我想要的确切二维数组
print('m1 == m2 ?',m1 == m2)
print('m1',m1)
print('m2',m2)
来自控制台的结果:
m1 == m2 ? True
m1 [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
m2 [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
但是,当我尝试将其值修改为m[i][0]= i and m[0][j] = j
时,如以下代码所示,我得到了两个完全不同的结果
for i in range(5):
m1[i][0] = i
m2[i][0] = i
for j in range(5):
m1[0][j] = j
m2[0][j] = j
print('m1 == m2 ?',m1 == m2)
print('m1 after',m1)
print('m2 after',m2)
和结果:
m1 == m2 ? False
m1 after [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
m2 after [[0, 1, 2, 3, 4], [1, 0, 0, 0, 0], [2, 0, 0, 0, 0], [3, 0, 0, 0, 0], [4, 0, 0, 0, 0]]
显然,m2是我需要的。使用m1的方法声明2d数组是错误的吗?
问题是,在[[0]*5]*5
中,最外面的列表在所有5个位置都填充有相同的列表。
您应该这样做:
[[0]*5 for y in range(5)]