为什么Python列表有一个extend方法?
为什么Python列表有一个extend方法?,python,list,Python,List,a_list.extend(list2)做了什么(或做得更好)而a_list+=list2没有 这是真的,除了观察到如果.extend()返回扩展列表以便您可以级联另一个方法,那么这将是一个答案。但是它不是,所以你不能。extend()是一个表达式,可以嵌入到更大的表达式中+=(增广赋值)是一条语句,语句永远不能嵌入表达式中 所以你可以这样做: doubled_extender = lambda l, it: l.extend(v for v in it for _ in range(2))
a_list.extend(list2)
做了什么(或做得更好)而a_list+=list2
没有
这是真的,除了观察到如果.extend()
返回扩展列表以便您可以级联另一个方法,那么这将是一个答案。但是它不是,所以你不能。extend()是一个表达式,可以嵌入到更大的表达式中<代码>+=(增广赋值)是一条语句,语句永远不能嵌入表达式中
所以你可以这样做:
doubled_extender = lambda l, it: l.extend(v for v in it for _ in range(2))
但是您不能在那里使用+=
请注意,对于列表
对象,+=
在返回self
之前使用的
最后但并非最不重要的一点是,在list.extend()
list.extend()是一个表达式,可以嵌入到更大的表达式中<代码>+=
(增广赋值)是一条语句,语句永远不能嵌入表达式中
所以你可以这样做:
doubled_extender = lambda l, it: l.extend(v for v in it for _ in range(2))
但是您不能在那里使用+=
请注意,对于列表
对象,+=
在返回self
之前使用的
最后但并非最不重要的一点是,添加到语言中的时间晚于
list.extend()
.extend
的另一个好处是,您可以在全局列表上调用它,因为这只会改变列表,而+=
在该上下文中不起作用,因为您无法在本地范围内分配给全局
演示
输出
['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
['one', 'two', 'three']
输出
['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
['one', 'two', 'three']
.extend
的另一个好处是,您可以在全局列表上调用它,因为这只会改变列表,而+=
在该上下文中不起作用,因为您无法在本地范围内分配给全局
演示
输出
['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
['one', 'two', 'three']
输出
['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
['one', 'two', 'three']
+=
是a)后来添加到语言中的,b)for list是作为list.extend()
call.Ah实现的-没有考虑历史记录。谢谢我认为a_list=a_list+list2
会导致制作列表副本,因此效率相对较低,对吗?还有为什么要否决?是的,连接会创建一个新的列表对象。这里有两种方法的详细信息:a_list=a_list+list2
创建一个新列表,并将其绑定到名称a_list
,替换原始列表对象。OTOH,a_list[:]=a_list+list2
将新列表复制回绑定到a_list
名称的原始列表对象。如果其他对象持有对a_list
的引用,并且您希望它们反映您对a_list
所做的任何更改,那么这可能会很有用,但是这比简单的a_list=a_list+list2
稍慢一些,a)后来添加到语言中,b)for list作为list.extend()实现
call.Ah-没有考虑历史。谢谢我认为a_list=a_list+list2
会导致制作列表副本,因此效率相对较低,对吗?还有为什么要否决?是的,连接会创建一个新的列表对象。这里有两种方法的详细信息:a_list=a_list+list2
创建一个新列表,并将其绑定到名称a_list
,替换原始列表对象。OTOH,a_list[:]=a_list+list2
将新列表复制回绑定到a_list
名称的原始列表对象。如果其他对象包含对a_列表的引用,并且您希望它们反映您对a_列表所做的任何更改,那么这可能会很有用,但是这比简单的a_列表=a_列表+列表2
要慢一些。当然,您可以始终将全局a_列表
添加到函数中。@chepner当然,但我尽量避免使用global
关键字。当然,无论你怎么做,以任何方式更改全局变量都是一种可疑的做法,我想在函数定义中使用global
关键字会提醒读者这一事实,我想这比使用.extend
或slice赋值“秘密”要好,因为“显式优于隐式”。当然,您总是可以将global a_list
添加到函数中。@chepner当然可以,但我尽量避免使用global
关键字。当然,无论你怎么做,以任何方式更改全局变量都是一种可疑的做法,我想在函数定义中使用global
关键字会提醒读者这一事实,我想这比使用.extend
或slice赋值“秘密”要好,因为“显式优于隐式”。