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

时间:2014-06-15 17:36:25

标签: python tuples immutability

它说

  

一旦创建了元组,就无法以任何方式进行更改。

但是当我做以下事情时:

t1=(4,5,8,2,3)
t1=t1+(7,1)
print(t1)

元组正在变为(4, 5, 8, 2, 3, 7, 1);这是为什么?真正意义上的"元组是不可变的"?

5 个答案:

答案 0 :(得分:7)

是的,元组是不可变的;一旦创建,它们就无法改变。 t1=t1+(7,1)创建新元组并将其分配给名称t1。它更改该名称最初引用的元组对象。

演示:

>>> t = (1, 2, 3)
>>> id(t)
4365928632
>>> t = t + (4, 5)
>>> id(t)
4354884624 # different id, different object

答案 1 :(得分:3)

代码中没有元组发生变化。 name t1用于引用一个新的,独特的元组。原始的元组对象永远不会改变,你只是停止使用它。

答案 2 :(得分:2)

是的,他们是不可改变的

t1 = t1 + (7,1)

正在创建一个新元组......不修改旧元组

尝试

t1[0] = 5

答案 3 :(得分:1)

基本上,当您致电t1=t1+(7,1)时,您重新分配 t1到不同的内存位置。 python的意思是不可变的,你可以通过切片来改变它们:

>>> t1=(4,5,8,2,3)
>>> t1[0] = 9
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> 

因为这会创建一个新的元组:

>>> t1=(4,5,8,2,3)
>>> id(t1)
4467745808
>>> t1 = t1+(9,)
>>> id(t1)
4468302112
>>> 

正如您在列表中看到的那样,他们保持id

>>> lst = [4, 5, 8, 2, 3]
>>> id(lst)
4468230480
>>> lst[0] = 6
>>> id(lst)
4468230480
>>> 

这是python对不变性的定义。

答案 4 :(得分:0)

我不能说是的。 Python元组有一个令人惊讶的特性:它们是不可变的,但它们的值可能会改变。这可能发生在元组持有引用时。任何可变对象,例如dict,list ......

>>> t1 = ('Bangalore', ['HSR', 'Koramangala'])
>>> print(t1)
('Bangalore', ['HSR', 'Koramangala'])
>>> print(id(t1)) # ID of tuple
4619850952

>>> place = t1[1]
>>> place.append('Silk Board')  # Adding new value to the list
>>> print(t1) 
('Bangalore', ['HSR', 'Koramangala', 'Silk Board'])
# Surprisingly tuple changed, let's check the ID
>>> print(id(t1)) # No change in the ID of tuple
4619850952

>>> print(t1[0])
Bangalore
>>> print(id(t1[0])) # ID of tuple's first element
4641176176
>>> print(id(t1[1])) # ID of tuple's second element (List)
4639158024
# These are the ref. id's of the tuple

>>> place.append('Agara')
>>> print(t1) 
('Bangalore', ['HSR', 'Koramangala', 'Silk Board', 'Agara'])
>>> print(id(t1))
4619850952
# Still no change, are they Immutable ??

>>> print(id(t1[1])) # The tuple having a ref. of Mutable object
4639158024

在上面的例子中,元组和列表的id没有改变。这是由于引用映射到元组而不是值。