为何Python中能修改元组内列表的元素?
为什么元组里的列表元素能被修改?
嘿,这个问题刚接触Python的时候真的很容易困惑!其实你操作完全没错,这就是Python里元组“不可变性”的一个容易被误解的点~
首先得明确:元组的不可变,指的是元组本身保存的**元素引用(也就是指向对象的内存地址)**不能被修改。换句话说,你不能给元组添加新元素、删除已有元素,也不能把元组里的某个元素替换成另一个对象(比如把tuplelist[1]改成另一个列表或者字符串)。
但如果元组里的元素是可变对象(比如列表、字典这类本身可以修改的对象),那情况就不一样了:元组只是保存了这个可变对象的引用,你修改这个对象内部的内容时,并没有改变元组里的引用——你只是在操作这个引用指向的对象本身。
看你的测试代码,用更清晰的方式展示就是:
# 初始化元组,第二个元素是一个列表 tuplelist = ('mouse', [1, 2, 3]) print(tuplelist) # 输出: ('mouse', [1, 2, 3]) # 修改列表里的第一个元素 tuplelist[1][0] = 999 print(tuplelist) # 输出: ('mouse', [999, 2, 3])
反过来,如果你尝试直接替换元组里的列表(也就是改变元组保存的引用),就会触发错误,这才是元组不可变性的体现:
# 尝试替换元组里的列表,会抛出TypeError tuplelist[1] = [4,5,6] # 错误信息: TypeError: 'tuple' object does not support item assignment
所以简单总结:元组锁死的是“它自己手里的那些指向对象的指针”,但指针指向的对象如果本身是可变的,那对象内部的内容还是可以自由修改的~
内容的提问来源于stack exchange,提问作者YorchAMC
相关产品推荐
相关产品推荐

