【问题标题】:Python list of list syntax [closed]Python列表语法列表[关闭]
【发布时间】:2012-06-26 16:53:55
【问题描述】:

这两个列表的声明有什么区别?

>>> l = [[]]*4
>>> l
[[], [], [], []]
>>> l[1].append(1)
>>> l
[[1], [1], [1], [1]]

>>> m = [[],[],[],[]]
>>> m[1].append(1)
>>> m
[[], [1], [], []]

【问题讨论】:

标签: python list syntax


【解决方案1】:

第一个创建了对单个列表的四个引用 --- 它是重复四次的同一个列表。第二个创建四个不同的列表。在第一种情况下,当您附加到一个列表时,它会影响所有这些,因为它们都是同一个对象。在第二种情况下,每个列表都是一个不同的对象,因此附加到一个对象不会影响其他对象。

【讨论】:

    【解决方案2】:

    这会给你一个清晰的想法,在l 中,所有对象都具有相同的id() 并且都是可变的,因此编辑其中任何一个也会自动编辑另一个,因为它们都只是对同一个对象的引用id=18671936m 都有不同的id(),所以它们都是不同的对象。

    >>> l = [[]]*4
    >>> for x in l:
            print(id(x))
    
    18671936 
    18671936
    18671936
    18671936
    
    >>> m=[[],[],[],[]]
    >>> for x in m:
            print(id(x))
    
    10022256
    18671256
    18672496
    18631696
    

    【讨论】:

      【解决方案3】:

      也许这将有助于使其更明确?这相当于您的第一个示例:

      >>> l1 = []
      >>> l2 = [l1]*4
      >>> l2
      [[], [], [], []]
      

      您在这里所做的基本上是创建一个包含 4 个项目的列表,所有这些项目都引用同一个列表。在我的代码中,该列表名为l1

      正如 Mark 在下面的评论中提到的,这也是这样的:

      >>> l1 = []
      >>> l2 = [l1, l1, l1, l1]
      >>> l2
      [[], [], [], []]
      

      【讨论】:

      • +1。在向其他人解释这一点时,我发现更进一步并解释上面的第二行相当于简单地写l2 = [l1, l1, l1, l1]
      【解决方案4】:

      帮助我理解这种现象的是,您需要显式地构造您想要的每个列表。

      您可以使用[] 显式构造一个空列表。在第一个示例中,您已经完成了一次,因此您有一个列表。在第二个中你已经完成了四次,所以有四个列表。

      如果你不想多次写[]你可以这样做

      [[] for _ in range(n)]
      

      【讨论】:

      • 好点。在 OP 的示例中,创建的不同列表的数量 == [] 的数量
      猜你喜欢
      • 2016-03-15
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多