在Python中创建M x N的数组
在Python中创建M x N的数组 一般有三种方法:
- 列表乘法
dp = [[0] * n] * m
- for 循环
dp= [[0 for _ in range(n)] for _ in range(m )]
- 乘法+for循环
dp = [[0] * n for _ in range(m )]
但是,在使用列表乘法创建的时候会出现问题:
dp = [[0]*2]*2
print(dp) # [[0, 0], [0, 0]]
print(id(dp[0])) #3142462401856
print(id(dp[1])) #3142462401856
dp[0][1] = 2
print(dp) # [[0, 2], [0, 2]]
这说明在二维列表乘法的时候外层只是用了引用,而不是新开辟空间建立数组. 从地址上也可以看出来,dp[0]
和dp[1]
实际上指向了同一个对象。因此,当尝试修改dp[0]
中的元素的时候,dp[1]
中的对应元素会同时修改。问题在于外层的乘法实际上已经是引用型。
同理,如果一维列表乘法的时候用的就是引用类型的数据,也会出现一样的情况
class A():
def __init__(self,a=0,b=1):
self.a = a
self.b = b
def change(self,c):
self.a = c
return 1
def __repr__(self):
return "A:[{},{}]".format(self.a,self.b)
if __name__ == "__main__":
test = A(2,3)
print(test) # A:[2,3]
testlist = [test]*3
print(testlist) # [A:[2,3], A:[2,3], A:[2,3]]
test.change(5)
print(test) # A:[5,3]
print(testlist) # [A:[5,3], A:[5,3], A:[5,3]]