2016-08-17 25 views
0

a_list.extend(list2)做什麼(或做得更好)那a_list += list2不?爲什麼Python列表有擴展方法?

這一切都是真的,除非觀察到如果.extend()返回擴展列表,以便可以級聯另一個方法,那將是一個答案。但它不,所以你不能。

+1

'+ ='是)加入到後面的語言和b)對列表被實現爲'list.extend()'呼叫。 –

+0

啊 - 沒有想過這個歷史。謝謝。我是否認爲'a_list = a_list + list2'會導致列表的副本被創建,因此效率相對較低?此外爲什麼downvotes? – nigel222

+1

是的,連接創建一個新的列表對象。 –

回答

10

list.extend()表達式並且可以嵌入到更大的表達式中。 +=(擴充賦值)是語句,語句永遠不能嵌入到表達式中。

所以,你可以這樣做:

doubled_extender = lambda l, it: l.extend(v for v in it for _ in range(2)) 

,但你不能使用+=那裏。

注意,對於list對象時,​​是+=用途,calls list.extend() directly返回self之前。

最後但並非最不重要,the Augmented Assignments feature被添加到晚於list.extend()的語言。

2

.extend的另一個好處是你可以在全局列表上調用它,因爲它僅僅改變了列表,而+=在這個上下文中不起作用,因爲你不能在本地作用域中指定一個全局列表。

演示

a_list = ['one'] 
list2 = ['two', 'three'] 

def f(): 
    a_list.extend(list2) 

def g(): 
    a_list += list2 

f() 
print(a_list) 
g() 
print(a_list) 

輸出

['one', 'two', 'three'] 
Traceback (most recent call last): 
    File "./qtest.py", line 43, in <module> 
    g() 
    File "./qtest.py", line 39, in g 
    a_list += list2 
UnboundLocalError: local variable 'a_list' referenced before assignment 

但是,你可以使用+=如果您還使用切片分配,因爲這也是原始列表的突變:

a_list = ['one'] 
list2 = ['two', 'three'] 

def g(): 
    a_list[:] += list2 

g() 
print(a_list) 

輸出

['one', 'two', 'three'] 
+0

當然,你可以隨時在函數中添加'global a_list'。 – chepner

+0

@chepner好的,但我儘量避免使用'global'關鍵字。當然,以任何方式改變全局變量都是一種可疑的做法,無論你如何去做,我想在你的函數定義中使用'global'關鍵字會向讀者提醒事實,我認爲這比「悄悄地」用'.extend'或slice賦值,因爲「顯式比隱式更好」。 –

相關問題