【问题标题】:Python list problem [duplicate]Python列表问题[重复]
【发布时间】:2010-12-29 21:45:02
【问题描述】:

蟒蛇:

m=[[0]*3]*2
for i in range(3):
    m[0][i]=1

print m

我希望这段代码应该打印出来

[[1, 1, 1], [0, 0, 0]]

但它会打印出来

[[1, 1, 1], [1, 1, 1]] 

【问题讨论】:

    标签: python list


    【解决方案1】:

    这是设计使然。当您对列表的元素使用乘法时,您就是在复制引用。

    请参阅the section "List creation shortcuts" on the Python Programming/Lists wikibook,其中详细介绍了对可变对象的列表引用问题。

    他们推荐的解决方法是列表理解:

    >>> s = [[0]*3 for i in range(2)]
    >>> s
    [[0, 0, 0], [0, 0, 0]]
    >>> s[0][1] = 1
    >>> s
    [[0, 1, 0], [0, 0, 0]]
    

    【讨论】:

      【解决方案2】:

      这有点邪恶,但当你明白你在做什么时就很明显了。当您执行[[0]*3]*2 位时,您首先创建一个包含 3 个零的列表,然后复制该列表以创建两个元素。但是,当您执行该复制时,您不会创建具有相同内容的新列表,而是多次引用同一个列表。所以当你改变一个时,它们都会改变。

      一个突出它的例子:

      In [49]: s = [[]]*2 # Create two empty lists
      
      In [50]: s # See: 
      Out[50]: [[], []]
      
      In [51]: s[0].append(2) # Alter the first element (or so we think)
      
      In [52]: s # OH MY, they both changed! (because they're the same list!)
      Out[52]: [[2], [2]]
      

      【讨论】: