在Python中使用可变序列方法创建列表失败

时间:2011-12-28 12:16:49

标签: python

这些工作:

>>> print [1,2,3] + [4,5]
[1,2,3,4,5]
>>> 'abc'.upper()
'ABC'

这不是:

>>> print [1,2,3].extend([4,5])
None

为什么呢?你可以在裸字符串上使用字符串方法,那么为什么不能在像列表这样的裸序列类型上使用方法呢?即使这样也行不通:

>>> print list([1,2,3]).extend([4,5])
None

N.B。对于“工作”的口语含义。当然,我的预期行为不正确的理由很充分。我只是好奇它是什么。


P.S。我接受了下面的灵魂检查答案,他是对的,但在调查添加运算符是如何实现的时候,我发现以下有效:

>>> [1,2,3].__add__([4,5])
[1, 2, 3, 4, 5]

但可能 add 方法不会修改底层对象并创建一个新的返回对象,如字符串方法。

2 个答案:

答案 0 :(得分:5)

extend有效,只是不会返回任何值,因为它正在修改它所使用的对象。这是一个python约定,不会从修改它们被调用的对象的方法返回任何值。

尝试:

 a = [1,2,3]
 a.extend([4,5])
 print a

编辑:

至于为什么这样做的一个原因可能是该方法应该返回的有时是不明确的。 list.extend应该返回扩展列表吗?一个布尔值?新列表大小?

它也是command-query separation的实现,即。如果它返回了一些东西,它将是一个查询和命令,并且cqs说这是邪恶的(虽然有时候很方便 - 见list.pop())。

所以一般来说你不应该从mutator返回任何东西,但是和python中的几乎所有内容一样,它只是一个指南。

list.__add__()是在列表上执行+时调用的方法 - 它返回一个新列表。

答案 1 :(得分:0)

这是由于界面的设计。 Extend确实扩展了列表,但没有返回任何值。

l = [1, 2, 3]
l.extend([4, 5])
print l