发现一个有点意思的问题,代码如下:
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 。