python初始化二维数组的两种方式及区别

最近写代码的时候,发现一个比较好玩的事情。

背景是这样的:

初始化一个a*b二维数组的二维数组

第一种写法:

我最开始的写法是这样的:

arr = [[0]*3] * 3

在尝试给其中某个元素赋值的时候,发现同一列的其他元素也会变成一样的值,大概就像这样:

print(arr)
print("-------")
arr[1][1] = 3
print(arr)

""" 输出:
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
-------
[[0, 3, 0], [0, 3, 0], [0, 3, 0]]
"""

是不是很神奇?

尝试定位,猜测这个二维数组的每个子数组引用了同一个对象。

打印id看下:

print(id(arr[0]))
print(id(arr[1]))
print(id(arr[2]))

""" 输出:
4303451584
4303451584
4303451584
"""

果然,他们的内存地址都是一样的

第二种写法:

arr = [[0]*3 for i in range(3)]

print(arr)
print("-------")
arr[1][1] = 3
print(arr)

print(id(arr[0]))
print(id(arr[1]))
print(id(arr[2]))

""" 输出:
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
-------
[[0, 0, 0], [0, 3, 0], [0, 0, 0]]
4378010048
4378009984
4378009856
"""

可以看见,尝试修改[1][1]的值,[0][1], [2][1]的值并没有被改变,且每个子数组的内存地址不一样

两种写法的对象是否相等?

尝试判断下两种写法生成的对象,直接比较是否相等

arr1 = [[0]*3 for i in range(3)]
arr2 = [[0]*3] * 3

print("原始状态是否一致: ", arr1 == arr2)

arr1[1][1] = 1
arr2[1][1] = 1
print(arr1 == arr2)
print("修改[1][1]后是否一致: ", arr1 == arr2)


""" 输出:
原始状态是否一致:  True
False
修改[1][1]后是否一致:  False
"""

可以看见,在未修改值之前,两个数组比较是相等的;

尝试修改[1][1]后,两个数组再次比较变得不再相等。

本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
python初始化二维数组的两种方式及区别
在尝试给其中某个元素赋值的时候,发现同一列的其他元素也会变成一样的值,大概就像这样:
<<上一篇
下一篇>>