【问题标题】:Unexpected Behavior of Extend with a list in Python [duplicate]在Python中使用列表扩展的意外行为[重复]
【发布时间】:2023-03-11 09:16:08
【问题描述】:

我试图了解 extend 在 Python 中是如何工作的,但它并没有达到我的预期。例如:

>>> a = [1, 2, 3]
>>> b = [4, 5, 6].extend(a)
>>> b
>>> 

但我早就料到了:

[4, 5, 6, 1, 2, 3]

为什么返回 None 而不是扩展列表?

【问题讨论】:

  • 你期待b = [4, 5, 6] + a 的作用。

标签: python arrays list immutability


【解决方案1】:

extend() 方法附加到现有数组并返回 None。在您的情况下,您正在动态创建一个数组 - [4, 5, 6],扩展它然后丢弃它。变量bNone 的返回值结束。

【讨论】:

    【解决方案2】:

    list 方法大部分在原地运行,并返回None

    >>> a = [1, 2, 3]
    >>> b = [4, 5, 6]
    >>> b.extend(a)
    >>> b
    [4, 5, 6, 1, 2, 3]
    

    【讨论】:

      【解决方案3】:

      其他人指出了许多list 方法,特别是那些改变列表的方法,返回None 而不是对列表的引用。他们这样做的原因是为了让您不会对是否制作了列表副本感到困惑。如果您可以写a = b.extend([4, 5, 6]),那么a 是对与b 相同列表的引用吗? b 被声明修改了吗?通过返回None 而不是变异列表,这样的语句就变得毫无用处,您很快就会发现a 中并没有您认为的那样,并且您学会了只写b.extend(...)。从而消除了缺乏清晰度。

      【讨论】:

        【解决方案4】:

        extend 扩展其操作数,但不返回值。如果你这样做了:

        b = [4, 5, 6]
        b.extend(a)
        

        然后你会得到预期的结果。

        【讨论】:

          【解决方案5】:

          我遇到了这个问题,虽然其他答案提供了正确的解释,但我喜欢的解决方案/解决方法不在这里。使用加法运算符会将列表连接在一起并返回结果。在我的情况下,我将 color 作为 3 位数列表和 opacity 作为浮点数进行簿记,但图书馆需要颜色作为 4 位数列表,不透明度作为第 4 位数。我不想命名一个一次性变量,所以这个语法适合我的需要:

          color = [1, 1, 0]
          opacity = 0.75
          plot.setColor(color + [opacity])
          

          这会即时创建一个新的不透明度列表,并在连接后创建一个新列表,但这对我的目的来说很好。我只是想要紧凑的语法来扩展一个带有浮点数的列表并返回结果列表而不影响原始列表或浮点数。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-05-30
            • 1970-01-01
            • 2014-02-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-16
            相关资源
            最近更新 更多