使用Python中的列表扩展的意外行为

时间:2011-09-21 22:08:01

标签: python arrays list immutability

我试图理解扩展如何在Python中工作,并且它并没有完全按照我的预期进行。例如:

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

但我原以为:

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

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

5 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:6)

list方法在大多数情况下就地运行,并返回None

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:3)

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

答案 4 :(得分:3)

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

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

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