【问题标题】:What's the difference between a += number and a += number, (with a trailing comma) when a is a list?当 a 是列表时,+= 数字和 += 数字(带有尾随逗号)有什么区别?
【发布时间】:2017-09-04 19:56:31
【问题描述】:

我正在阅读 Python 代码的 sn-p,但有一件事我无法理解。 a 是一个列表,num 是一个整数

a += num,

有效但

a += num 

行不通。谁能给我解释一下?

【问题讨论】:

    标签: python list tuples extend


    【解决方案1】:

    首先,重要的是要注意a += 1, 在这种情况下与a = a + 1, 的工作方式不同。 (a = a + 1,a = a + (1,) 都抛出了 TypeError,因为你不能连接一个列表和一个元组,但是你可以扩展一个带有元组的列表。)

    += 调用列表__iadd__ 方法,该方法调用list.extend 然后返回原始列表本身。

    1, 是一个长度为 1 的元组,所以你正在做的是

    >>> a = []
    >>> a.extend((1,))
    >>> a
    [1]
    

    由于长度为一个元组,这看起来很奇怪。但它的工作原理就像用任意长度的元组扩展一个列表:

    >>> a.extend((2,3,4))
    >>> a
    [1, 2, 3, 4]
    

    【讨论】:

    • 谢谢 timgeb!这真的很有帮助!我认为 a +=1, 等同于 a = a+ (1,) 显然这不是 python 的工作方式。
    • @yuhengd 是的,列表做“那个”,事实并没有很好的记录。
    【解决方案2】:

    结尾的逗号使赋值的右侧变成一个元组,而不是一个整数。元组是类似于列表的容器结构(有一些区别)。例如,这两个是等价的:

    a += num,
    a += (num, )
    

    Python 允许您将元组添加到列表中,并将元组的每个元素附加到列表中。它不允许您将单个整数添加到列表中,您必须为此使用 append 。

    【讨论】:

      【解决方案3】:

      使用

      num,
      

      声明一个长度为 1 的元组,而不是整数。

      因此,如果 a = [0,1] 且 num = 2

      a+=num,
      

      等价于

      a.extend((num,))
      

      a.extend((2,))=[0,1,2]
      

      同时

      a+=num
      

      等价于

      a.extend(num)
      

      a.extend(2)
      

      这会产生错误,因为您可以将元组附加到数组,但不能附加整数。因此第一个公式有效,而第二个给你一个错误

      【讨论】:

      • 这里的怪癖是a+=num,等同于a=a+(num,),第二个抛出TypeError。第一个没有,因为内部+= 使用list.extend
      • 谢谢,这确实使我的回答颇具误导性。我修改了它。
      • 还要注意extend返回None,所以你的分配分配给None
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多