【问题标题】:How is a tuple immutable if you can add to it (a += (3,4))如果可以添加元组,元组如何不可变 (a += (3,4))
【发布时间】:2013-04-28 04:21:23
【问题描述】:
>>> a = (1,2)
>>> a += (3,4)
>>> a
(1, 2, 3, 4)
>>> 

还有一个列表:

>>> b = [1,2]
>>> b += [3,4]
>>> b
[1, 2, 3, 4]
>>> 

由于元组是不可变的,而列表是可变的,我们如何解释这种行为?

【问题讨论】:

  • 我认为+= 定义了一个新元组并返回它(即不会改变现有的元组)。关键不是你看到的值,而是底层对象是否相同。使用列表时,会添加相同的对象(不会创建新对象)。
  • 数字也是不可变的,但a = 2; a += 2 有效。
  • @cool_n_curious 请注意,这对于元组来说是一项代价高昂的操作。列表可以简单地扩展自己,而每次执行此操作时元组都必须构造一个全新的元组,因此在需要时使用列表

标签: python list tuples


【解决方案1】:

在示例中,您并没有更改实际的元组,您只是更改了变量 a 指向的元组。在此示例中,a += (3, 4)a = a + (3, 4) 相同。如果我们在操作之前和之后检查aid,我们可以看到差异:

>>> a = (1, 2)
>>> id(a)
60516360
>>> a += (3, 4)
>>> id(a)
61179528

对于列表,+= 调用列表上的 .extend(),这会就地更改它。

>>> b = [1, 2]
>>> id(b)
62480328
>>> b += [3, 4]
>>> id(b)
62480328

注意bid在操作后不会改变。

【讨论】:

    【解决方案2】:

    元组是不可变类型,意味着您不能更改存储在变量a 中的值。例如,执行以下操作

    >>> a = (1, 2)
    >>> a[0] = 3
    

    抛出错误TypeError: 'tuple' object does not support item assignment

    另一方面,对于列表,

    >>> a = [1, 2]
    >>> a[0] = 3
    

    这是完全有效的,因为它是可变的。

    您正在做的是将值重新分配给变量名。

    a = a + (3, 4) 只是将两者连接起来并将其重新分配给变量a。您实际上并没有更改元组的值。

    例如,string 是不可变的,因此,

    >>> name = "Foo"
    >>> name[0] ='o' 
    

    抛出与上述类似的错误。但是,以下是重新分配,完全有效。

    >>> name = name + " Bar"
    >>> name
    'Foo Bar'
    

    它只是进行连接。

    【讨论】:

      猜你喜欢
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 2020-03-06
      • 2020-03-01
      • 1970-01-01
      相关资源
      最近更新 更多