Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python列表有一个extend方法?_Python_List - Fatal编程技术网

为什么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赋值“秘密”要好,因为“显式优于隐式”。