它说
一旦创建了元组,就无法以任何方式进行更改。
但是当我做以下事情时:
t1=(4,5,8,2,3)
t1=t1+(7,1)
print(t1)
元组正在变为(4, 5, 8, 2, 3, 7, 1)
;这是为什么?真正意义上的"元组是不可变的"?
答案 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没有改变。这是由于引用映射到元组而不是值。