【问题标题】:Are tuples really immutable in Python? [duplicate]元组在 Python 中真的是不可变的吗? [复制]
【发布时间】:2015-12-24 07:07:18
【问题描述】:

今天遇到的一个问题,实际测试了Python中元组的不变性:

  • 采访者:元组在 Python 中是不可变的吗?

  • :是的

  • 采访者:那么print(t1)这里打印的是什么?

    t1 = (4, 5)
    t1 = t1 + (91, 10)
    print(t1)
    
  • (4, 5, 91, 10)

  • 采访者:元组的不变性如何定义这种行为?

  • :与不变性无关,t1 标签指的是一个新的元组。

  • 面试官

    >>> t = (1, 2, [3, 4]) 
    >>> t[2] += [5, 6]
    

    接下来会发生什么?

  • TypeError被提升

  • 采访者:之后t的价值是多少?

  • (1, 2, [3, 4])(1, 2, [3, 4, 5, 6]) 也许,不确定

  • 采访者:是什么让你认为值会变成(1, 2, [3, 4, 5, 6]),如果我写了会发生什么

    >>> t[2] = t[2] + [5, 6]
    

    这次操作后t2 还是(1, 2, [3, 4, 5, 6]) 吗?

【问题讨论】:

标签: python python-2.7 python-3.x tuples immutability


【解决方案1】:

即使元组是不可变的,其中的对象也可以是可变的

由于在>>> t = (1, 2, [3, 4]) 中,列表是可变的,因此您可以使用增强赋值来更改列表值。 += 但随后引发异常。

这里 t[2] 列表已修改,如您所见

t =(1,2,[3,4])
>>> id(t[2])
38073768
>>> t[2] += [5,6]
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t[2]
[3, 4, 5, 6]
>>> id(t[2])
38073768

如您所见,t[2] id 永远不会改变。

至于第二种情况:t[2] = t[2] + [5,6] - 它创建一个新列表,然后将其分配给t[2]

>>> li = [1,2]
>>> id(li)
38036304
>>> li = li + [3,4]
>>> id(li)
38074368
>>> li += [5,6]
>>> id(li)
38074368

如您所见,List = list + [] 是一个具有不同 ID 的新列表。并且由于元组是不可变的 t[2] 在第二种情况下不会被分配给新对象

【讨论】:

  • 1.元组绝对不可变,但它们可以包含(引用)可变对象。 2. 这并不能解释为什么t[2] += [5, 6]t[2] = t[2] + [5, 6] 不同。
  • @jonrsharpe 我更改了短语。相对不变性是指它可以具有可变对象
  • 这仍然不包括2。
  • @jonrsharpe 更新了答案
猜你喜欢
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 2019-08-20
  • 1970-01-01
  • 2013-02-19
  • 2017-02-02
  • 2018-03-03
相关资源
最近更新 更多