【问题标题】:Append item to a specified list in a list of lists (Python) [duplicate]将项目附加到列表列表中的指定列表(Python)[重复]
【发布时间】:2013-03-08 20:35:30
【问题描述】:

我目前正在通过解决来自项目 euler 的问题来练习我的编程技能,现在我在 Python 上遇到了一些(在我看来)奇怪的行为。

当我这样做时:

list = [[1]]*20

正如预期的那样,我得到了一个包含元素 1 的 20 个列表的列表。但是,当我想将 2 附加到此列表中的第三个元素时,我会这样做:

list[3].append(2)

然而,这会改变列表中的所有元素。即使我绕道而行,比如:

l = list[3]
l.append(2)
list[3] = l

我所有的元素都变了。谁能告诉我如何执行此操作并获得如下输出:

[[1], [1], [1], [1, 2], [1] .... [1]]

提前致谢。

【问题讨论】:

    标签: python list append


    【解决方案1】:

    Python 列表是可变对象,因此当您执行 [[1]]*20 时,它会创建 一个 列表对象 [1],然后将 20 个对它的引用放在顶级列表中。

    就可变性问题而言,和下面是一样的

    a = [1,2,3]
    b = a
    b.append(4)
    a # [1,2,3,4]
    

    发生这种情况是因为b=a 只是将 referencea 复制到b 的列表实例。它们都指的是同一个实际列表。

    为了创建列表列表,就像您在上面尝试的那样,您需要为每个条目创建一个唯一列表。列表推导效果很好:

    mainlist = [[1] for x in range(20)]
    mainlist[0].append(2)
    mainlist # [[1,2],[1],[1],...]
    

    编辑

    顺便说一句,由于类型名称是 Python 中的元类,因此使用类型名称命名变量是个坏主意。 原因是这可能会导致代码中出现一些问题:

    a = range(3) # [0,1,2]
    type(a) # (type 'list')
    isinstance(a, list) # True
    

    现在,创建一个名为list的变量

    list = range(3)
    list # [0,1,2]
    isinstance(list, list)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
    

    更不用说,现在你不能使用list() 运算符

    c = list((1,2,3))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'list' object is not callable
    

    【讨论】:

    • 非常感谢您的快速回复。直到我发现这种好奇心,我才知道程序中的错误在哪里。很高兴知道这一点,谢谢。 :)
    • 其实我注意到你之前编辑中提到的问题。这只是为了示例的目的,不会再这样做了。
    • @SanderKersten 不用担心。我只是觉得它值得解决,因为它似乎经常出现......我以前每次在我的编辑器中玩一个小的三行函数时都会在自己的代码中犯这个错误,然后复制它进入一个更大的程序并破坏一切,所以我必须让自己养成从不使用变量类型名称的习惯。
    • 我最典型的失败是for list in lists 或任何for &lt;type&gt; in &lt;type&gt;s 类型的迭代器,这将保留循环运行的整个范围的变量名。
    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 2011-10-12
    • 2023-03-31
    • 2011-01-31
    • 2013-08-07
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多