2011-12-28 43 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