Python 的元组疑惑

2023/11/15 Python

发现一个有点意思的问题,代码如下:

t = (['a'], 1, 2)
try:
    t[0] += ['b', 'c']
except Exception as e:
    print(e)
print(t)

# output: 
# 'tuple' object does not support item assignment
# (['a', 'b', 'c'], 1, 2)

这代码对于我这个不正经的python学习者来说,确实会产生点疑惑。抛出异常,但是t的值确实改变了。虽然我知道不可以直接增加、修改、删除元组的元素,但如果元素是可变元素,还是可以修改可变元素本身的。可是这段代码着实是有点奇怪,可变元素确实是变了,但还是抛出异常。问题先记着,再看看另一段代码:

t = (['a'], 1, 2)
try:
    t[0].extend(['b', 'c'])
except Exception as e:
    print(e)
print(t)

# output: 
# (['a', 'b', 'c'], 1, 2)

这段代码就不会抛出异常了,可见,元组内的可变元素本身是可以被修改的,那么在修改元组的可变元素之后,想必是多了什么操作,再回看之前t[0] += ['b', 'c']以及'tuple' object does not support item assignment,咦,这是提醒我们,它做了赋值操作t[0] += ['b', 'c']t[0].extend(['b', 'c'])的效果多了一个赋值,也就相当于:

t = (['a'], 1, 2)
try:
    t[0].extend(['b', 'c'])
    t[0] = t[0]
except Exception as e:
    print(e)
print(t)

# output: 
# 'tuple' object does not support item assignment
# (['a', 'b', 'c'], 1, 2)

嗯,结果对上了,赋值成功,但抛出同样的异常。虽然我们不一定能看懂python的源码,但可以通过异常推断python在背后的大概操作。

刚写完,在翻看官方文档时看到这个链接,补充一下 https://docs.python.org/zh-cn/3/faq/programming.html#why-does-a-tuple-i-item-raise-an-exception-when-the-addition-works

Search

    Table of Contents