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]后,两个数组再次比较变得不再相等。