2014-12-05 133 views
3

我和我的翻譯工作,找出了Python append()方法的行爲,結果發現:因爲我覺得這讓我爲難,意外行爲list.append

In [335]: b = [].append(1) 

In [336]: b 

In [337]: 

In [337]: b = [].append('1') 

In [338]: b 

,每當我們稱之爲append()名單上,我們添加新對象到其結束,所以不應該對空列表調用append()(如我上面所說的那樣)給我同樣的結果,我可以有實現:

In [339]: b=[] 

In [340]: b.append(1) 

In [341]: b 
Out[341]: [1] 

我可能有一種誤解,在這裏,所以請更正我如果我錯了。

回答

5

,因爲我認爲只要我們一 名單上調用append(),我們添加新對象到其結束

這是正確的這令我費解。但是你忘記的是append()(就像大多數變異對象的方法)總是在Python中返回None,因爲它在原地運行。那麼,這樣做:

b = [].append(1) 

是一樣的:

b = None 

1在技術上添加到列表[],但沒有辦法調用append()後訪問,因爲b是這個名單分配給方法調用的返回值。

第二個例子工作正常,只是因爲你沒有重新分配b,從而失去了對列表對象的引用。

+0

哦對。嗯,有沒有什麼理由說'apppend()'返回'None'是好的?是因爲,就像在第二個例子中,當我做了'b.append()',如果append()'沒有返回'None',那麼它會修改'b'的類型並改變它的值?因爲現在看來,如果'append()'總是返回'None',那麼在'b'上調用'append()'也會導致'b'的值更改爲'None',即使在第二個例。我的誤解是什麼? – AKKO 2014-12-05 03:47:05

+0

我相信它的基本原理是它強制簡單和明確。你必須一次做一件事,避免大量的意大利麪陳述和副作用。 – tripleee 2014-12-05 04:29:29

+0

@AKKO - 那你必須向Python核心開發者詢問爲什麼'append()'返回'None'的確切原因。這只是一個設計決定。我猜想是這樣,你不能把這個電話埋在另一條線內。由於'append()'改變了列表,它應該在它自己的路線上引起注意。事實上,幾乎所有在Python中改變對象的方法都遵循這個約定並返回None。 – iCodez 2014-12-05 15:54:25

2

append是一種不返回任何內容的方法。所以調用ls.append(1)將在ls的末尾附加1,但ls.append(1)沒有實際價值。因此設置b = [].append('1')b設置爲None