2011-12-28 45 views
1

这些工作:创建使用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.我已经接受soulcheck的答案下面,他是对的,但对研究如何加法运算来实现我刚刚发现了以下工作:

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

但想必添加方法不会修改底层对象,并创建一个新的返回,如字符串方法。

回答

5

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

尝试:

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

编辑:

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

另外它是command-query separation的实现,即。如果它返回的东西将是一个查询和命令在一个和cqs说它是邪恶的(虽然有时方便 - 见list.pop())。

所以一般情况下,你不应该从mutators返回任何东西,但几乎所有的东西在python它只是一个指导方针。

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

+0

虽然字符串是不可变的,所以字符串方法不能修改原始对象,所以他们确实返回一个值?这对于说图不起作用,因为尽管它们像字符串一样是不可变的,但它们没有任何方法,因为只有可变序列才有方法。或者其他的东西。接受! – 2011-12-28 14:59:52

+0

@SimonHibbs。你给的字符串和列表例子创建一个新的字符串/列表。这种约定的一个原因可能是,有时候该方法应该返回的方式有些模糊。 list.extend应该返回扩展列表吗?布尔?新的列表大小?它也是[命令 - 查询分离](http://en.wikipedia.org/wiki/Command-query_separation)的实现,即。如果它返回的东西,它将是一个查询和命令在一个==邪恶。我会编辑它。 – soulcheck 2011-12-28 15:18:01

0

这是由于界面的设计。 Extend扩展列表,但不返回任何值。

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

当然,通常不鼓励命名列表'列表'。 – PaulMcG 2011-12-28 12:34:20

+0

因为您需要一个有意义的名字,所以不鼓励名单列表“list”。但是在讨论列表的示例代码中,什么更有意义? – ugoren 2011-12-28 12:40:14

+0

@PaulMcGuire当然你是对的。我只是在输入这段代码时没有想到。 – Howard 2011-12-28 12:40:28