【问题标题】:Why do Python lists have an extend method? [duplicate]为什么 Python 列表有扩展方法? [复制]
【发布时间】:2016-12-24 03:33:18
【问题描述】:

a_list.extend(list2) 做了哪些(或做得更好)而 a_list += list2 没有做的事情?

真的是这样,除了观察到如果.extend() 返回扩展列表,这将是一个答案,因此您可以级联另一个方法。但它没有,所以你不能。

【问题讨论】:

  • += 是 a) 后来添加到语言中 b) 列表作为 list.extend() 调用实现。
  • 啊——没想到历史。谢谢。我认为a_list = a_list + list2 会导致制作列表副本,因此效率相对低下,这是否正确?还有为什么投反对票?
  • 是的,连接会创建一个新的列表对象。
  • 更多关于这两种方式的信息:stackoverflow.com/questions/3653298/…
  • a_list = a_list + list2 创建一个新列表并将其绑定到名称 a_list,替换原始列表对象。 OTOH,a_list[:] = a_list + list2 将新列表复制回绑定到 a_list 名称的原始列表对象。如果其他对象持有对a_list 的引用并且您希望它们反映您对a_list 所做的任何更改,这将很有用,但是这比简单的a_list = a_list + list2 慢一点。

标签: python list


【解决方案1】:

list.extend() 是一个表达式,可以嵌入到更大的表达式中。 +=(增强赋值)是一个语句,语句永远不能嵌入到表达式中。

所以你可以这样做:

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

但你不能在那里使用+=

请注意,对于list 对象,+= 使用的object.__iadd__() special methodcalls 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']
    

    【讨论】:

    • 当然,您可以随时在函数中添加global a_list
    • @chepner 当然可以,但我尽量避免使用global 关键字。当然,无论你怎么做,以任何方式改变全局变量都是一种可疑的做法,我想在你的函数定义中使用 global 关键字会提醒读者注意这一事实,我认为这比“偷偷摸摸”做更好使用.extend 或切片赋值,因为“显式优于隐式”。
    猜你喜欢
    • 2012-02-05
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    相关资源
    最近更新 更多