我今天遇到的一个问题,实际上测试了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])
吗?
答案 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永远不会改变。
至于第二种情况: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]在第二种情况下不会被分配给新对象