元组与多数python集合(列表、字典、集,等等)一样,保存的是对象的引用。如果引用的元素是可变的,即便元组本身不可变,但是元素依然可变。也就是说元组的不可变性其实是指tuple数据结构的物理内容(即保存的引用)不可变,与引用的对象无关。
下列栗子表明元组的值会随着引用的可变对象的变化而变。元组中不可变的是引用的标识。
1 >>> t1 = (1, 2, [30, 40]) 2 >>> t2 = (1, 2, [30, 40]) 3 >>> t1 is t2 4 False 5 >>> t1 == t2 6 True 7 >>> id(t1[-1]) 8 139727093562696 9 >>> t1[-1].append(99) 10 >>> t1 11 (1, 2, [30, 40, 99]) 12 >>> id(t1[-1]) 13 139727093562696 14 >>> t1 == t2 15 False
可见t1[-1]的标识没变,只是值变了。