在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]]
posted @ 2020-11-29 18:58  Cetusの  阅读(748)  评论(0编辑  收藏  举报