2012-07-20 47 views

回答

3

正如OscarLópez等人已經解釋過的,extend是一個返回None的命令,以遵守命令/查詢分離。

他們都建議通過使用extend作爲命令來修復此問題。但有一個替代方案:使用查詢來代替:

>>> var = [0] + range(1, 10) 

瞭解這裏的區別很重要。 extend修改您的[0],將其變爲[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]。但+運營商將您的[0]單獨留下,並返回一個新列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

如果您有其他參考清單並想要全部更改它們,顯然您需要extend

然而,在情況下,你只是使用[0]作爲一個值,使用+不僅可以讓你寫緊湊,流體代碼(如你想),這也避免了變異值。這意味着如果你使用不可變的值(比如元組)而不是列表,那麼相同的代碼就可以工作,但更重要的是,這對避免副作用的函數式編程風格至關重要。 (這種風格有很多原因是有用的,但一個明顯的原因是不可變對象和無副作用函數本質上是線程安全的。)

10

list.extend是一個就地的方法。它對對象本身執行操作並返回None

這會工作:

var = [0] 
var.extend(range(1, 10)) 

更妙的是這樣的:

var = list(range(10)) 
6

extend()不返回任何東西(實際上None),它的變化 「就地」,即,該列表本身被修改。

我認爲你是在此之後:

>>> var = [0] 
>>> var.extend(range(1, 10)) 
>>> var 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
+0

@nightcracker。 。感謝編輯 - 不喜歡IPython? ;-) – Levon 2012-07-20 21:31:02

+0

從來沒有使用或看到過,所以我認爲這是一些構成語法。所以我編輯成了更常用的CPython格式。 – orlp 2012-07-20 21:37:26

+0

@nightcracker這是一個非常強大(而且很棒)的Python shell值得研究.. http://ipython.org/ ..我一直在使用它一段時間,但不斷髮現它的新功能。我知道其他人也使用它,因爲我看到他們也粘貼他們的代碼。 (我通常會回去拿出[]等..所以謝謝你這樣做對我來說) – Levon 2012-07-20 21:39:03

4

對於問題的代碼工作,你需要做這樣的事情:

>>> var = [0] 
>>> var.extend(range(1,10)) 
>>> var 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

這不是以前的工作因爲extend()返回None,這就是設計:Python正在遵循Command/Query Separation

+1

+1教我關於命令/查詢分離。我以前沒有聽說過這個詞。 – 2012-07-20 21:36:44

相關問題