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

Sim*_*bbs 1 python

这些工作:

>>> print [1,2,3] + [4,5]
[1,2,3,4,5]
>>> 'abc'.upper()
'ABC'
Run Code Online (Sandbox Code Playgroud)

这不是:

>>> print [1,2,3].extend([4,5])
None
Run Code Online (Sandbox Code Playgroud)

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

>>> print list([1,2,3]).extend([4,5])
None
Run Code Online (Sandbox Code Playgroud)

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


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

>>> [1,2,3].__add__([4,5])
[1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

但是可能add方法不会修改底层对象并创建一个新的返回对象,就像字符串方法一样.

sou*_*eck 5

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

尝试:

 a = [1,2,3]
 a.extend([4,5])
 print a
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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

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

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