元组在Python中真的是不可变的吗?

时间:2015-09-26 16:24:29

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

我今天遇到的一个问题,实际上测试了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])吗?

  •   

1 个答案:

答案 0 :(得分:2)

即使元组是不可变的,它内部的对象也是可变的

由于在>>> 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永远不会改变。

enter image description here

至于第二种情况: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的新列表。并且由于元组是不可变的,[2]在第二种情况下不会被分配给新对象