【问题标题】:Python, is this a bug, append to a list within a tuple results in None? [duplicate]Python,这是一个错误,附加到元组中的列表导致无? [复制]
【发布时间】:2012-03-25 22:48:48
【问题描述】:

这是我长期以来写的最短的示例之一

我创建和更新一个元组3

In [65]: arf=(0,1,[1,2,3])

In [66]: arf=(arf[0],arf[1], arf[2] )

In [67]: arf
Out[67]: (0, 1, [1, 2, 3])

所以重新分配成功了。

现在我尝试更改它的内容。

In [69]: arf=(arf[0],arf[1], [2] )

In [70]: arf
Out[70]: (0, 1, [2])

In [71]: arf=(arf[0],arf[1], arf[2].append(3) )

In [72]: arf
Out[72]: (0, 1, None)

我回来了没有???嘿,什么给了?对不起,我是python菜鸟。

【问题讨论】:

    标签: python list append tuples iterable-unpacking


    【解决方案1】:

    list.append() 总是返回 None

    所以arf[2].append(3) 会将3 附加到arf 并返回None

    您永远不会看到对 arf[2] 的更改,因为您会立即将 arf 重新绑定到新创建的元组

    也许这就是你想要的

    arf = (arf[0], arf[1], arf[2]+[3])
    

    【讨论】:

    • 啊,我正试图将它全部压缩到一个 lambda 函数中。有没有办法避免创建中间变量?
    • @BryanHunt 停止尝试将其压缩到 lambda 中:只需使用命名函数,您什么都不会丢失。
    • 谢谢伙计,效果很好。
    • 将它与 Scala 代码进行比较,这个维基百科页面让我这样做了 en.wikipedia.org/wiki/… 我想用 matplotlib 创建一个频率图
    【解决方案2】:

    list.append 方法更改列表并返回None。这不是错误,这正是 append 方法的工作原理。

    【讨论】:

    【解决方案3】:

    append 不返回新列表,它就地修改旧列表:

    >>> a = [1, 2, 3]
    >>> b = a.append(4)
    >>> print b
    None
    >>> print a
    [1, 2, 3, 4]
    

    【讨论】:

      【解决方案4】:

      为了详细说明 gnibbler 的答案,list.append() 会更改列表本身,但它不会返回列表的新值。它返回None。因此,您的命令 71 以您想要的方式更改 arf[2] 的值,但随后它立即返回 None 并将 arf[2] 设置为该值。

      您的示例中的自引用使事情变得有些模糊,但是如果您尝试像someothervariable=arf[2].append(3) 这样的命令,您就会看到它是如何工作的。 someothervariable 设置为 None 并且 arf[2] 有 3 附加没有明确的赋值语句。

      【讨论】:

        猜你喜欢
        • 2015-06-27
        • 2012-09-28
        • 1970-01-01
        • 1970-01-01
        • 2017-02-02
        • 2020-10-29
        • 1970-01-01
        相关资源
        最近更新 更多