【问题标题】:Initialise matrix in python [duplicate]在python中初始化矩阵[重复]
【发布时间】:2011-06-15 10:13:51
【问题描述】:

可能重复:
Python list problem

我尝试在 python 中初始化一个矩阵。 首先我是这样做的:

>>> M=[[0]*4]*4

但这是我的问题,当我更改第一行时,每一行都在更改:

>>> M
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> M[1][1]=1
>>> M
[[0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0]]

所以我是这样做的:

>>> M= [ [ 0 for i in range(4) ] for j in range(4) ]

而且 ut 工作正常:

>>> M
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> M[1][1]=1
>>> M
[[0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

我的问题是:

这两个表达的真正含义是什么?以及为什么第一个这样做?

提前感谢您的帮助。

【问题讨论】:

    标签: python list


    【解决方案1】:

    当您将这些列表相乘时,Python 通过引用复制它们,而不是创建全新的对象。

    一个简单的例子可能会有所帮助,展示通过引用复制会发生什么:

    >>> pie = ['apple', 'cherry', 'pecan']
    >>> pie_copy = pie
    >>> pie_copy[0] = 'banana'
    >>> pie
    ['banana', 'cherry', 'pecan']
    >>> pie is pie_copy
    True
    >>> new_pie = ['banana', 'cherry', 'pecan']
    >>> pie is new_pie
    False
    

    同 pie_copy 和 pie 指向同一个列表一样,通过乘法构建列表时,所有的副本都指向同一个列表。

    在您使用range() 和列表推导的第二个sn-p 中,您不会获取一个列表并多次复制它;理解中的每次迭代都会创建一个新列表,因此您不会遇到相同的引用复制问题。

    【讨论】:

      【解决方案2】:

      因为这里M=[[0]*4]*4 您在对象上创建链接。

      类似

      >>> a = [0, 0, 0]
      >>> b = [a,a,a]
      >>> b
      [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
      >>> a[1] = 1
      >>> b
      [[0, 1, 0], [0, 1, 0], [0, 1, 0]]
      >>>
      

      UPD 链接我的意思是参考,如果有点混乱,对不起

      【讨论】:

        【解决方案3】:

        a 是一些python 对象。那么[a] * 4等价于[a,a,a,a]。这意味着什么取决于a 是否可变。数字、字符串和元组不是,所以如果 a 是这些类型的对象之一(在您的示例中为 0),那么您将获得 4 个独立可更改的副本。列表、字典和集合是可变的,在这种情况下,您只需获得对同一对象的 4 个引用,在您的情况下为列表 [0] * 4。利用这些知识,你会发现你可以做到这一点:

        M = [[0] * 4 for i in range(4)]
        

        得到你想要的。

        【讨论】:

          猜你喜欢
          • 2013-08-29
          • 2018-02-19
          • 2020-01-08
          • 2017-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多