a_list.extend(list2)
做什麼(或做得更好)那a_list += list2
不?爲什麼Python列表有擴展方法?
這一切都是真的,除非觀察到如果.extend()
返回擴展列表,以便可以級聯另一個方法,那將是一個答案。但它不,所以你不能。
a_list.extend(list2)
做什麼(或做得更好)那a_list += list2
不?爲什麼Python列表有擴展方法?
這一切都是真的,除非觀察到如果.extend()
返回擴展列表,以便可以級聯另一個方法,那將是一個答案。但它不,所以你不能。
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()
的語言。
.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']
當然,你可以隨時在函數中添加'global a_list'。 – chepner
@chepner好的,但我儘量避免使用'global'關鍵字。當然,以任何方式改變全局變量都是一種可疑的做法,無論你如何去做,我想在你的函數定義中使用'global'關鍵字會向讀者提醒事實,我認爲這比「悄悄地」用'.extend'或slice賦值,因爲「顯式比隱式更好」。 –
'+ ='是)加入到後面的語言和b)對列表被實現爲'list.extend()'呼叫。 –
啊 - 沒有想過這個歷史。謝謝。我是否認爲'a_list = a_list + list2'會導致列表的副本被創建,因此效率相對較低?此外爲什麼downvotes? – nigel222
是的,連接創建一個新的列表對象。 –