我对修改元组成员有点困惑。以下不工作:不可变容器内的可变类型
>>> thing = (['a'],)
>>> thing[0] = ['b']
TypeError: 'tuple' object does not support item assignment
>>> thing
(['a'],)
但这并工作:
>>> thing[0][0] = 'b'
>>> thing
(['b'],)
也可以工作:
>>> thing[0].append('c')
>>> thing
(['b', 'c'],)
不工作,工作(呵呵!) :
>>> thing[0] += 'd'
TypeError: 'tuple' object does not support item assignment
>>> thing
(['b', 'c', 'd'],)
看似等同于以前的,但工程:
>>> e = thing[0]
>>> e += 'e'
>>> thing
(['b', 'c', 'd', 'e'],)
那么究竟是游戏规则,当你能和不能修改一个元组里面的东西?这似乎更像是禁止对元组成员使用赋值运算符,但后两种情况令我困惑。
为什么'thing [0] + ='e''等于thing [0] = thing [0] + ['e']',这会构建正确的列表然后在分配失败时丢失它?也就是说,如果它简化为'.extend('e')',为什么'tmp'呢?为什么不只是'东西[0] .extend('e')'? – 2012-02-07 07:31:50
@ChrisLutz:是的,好点。你完全正确:它不等同于'thing [0] .extend('e')',而是等同于你所说的'thing [0] = thing [0] +'e''。我已经解决了这个问题的答案。 – 2012-02-07 08:27:01
我仍然不明白我标记为“不工作,有效”的情况。我希望它可以a)工作,修改列表或者b)引发异常并且不修改列表。它如何失败,并发生异常并修改该值? – wim 2012-02-08 04:11:39