16

かなり奇妙なことに出くわしました。

>>> t = ([],)
>>> t[0].append('hello')
>>> t
(['hello'],)
>>> t[0] += ['world']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t
(['hello', 'world'],)

なぜそれは上昇TypeErrorし、それでもlist内部を変えるのtupleですか?

4

2 に答える 2

20

コメントで言及し始めたように、+=実際にはリストをその場で変更し、結果をタプルの最初の位置に割り当てようとします。データモデルのドキュメントから:

これらのメソッドは、拡張算術代入 (+=、-=、=、/=、//=、%=、* =、<<=、>>=、&=、^=、|=) を実装するために呼び出されます。これらのメソッドは、その場で操作を実行し (self を変更)、結果を返します (self である必要はありませんが、self である必要はありません)。

+=したがって、次と同等です。

t[0].extend(['world']);
t[0] = t[0];

したがって、リストは変更可能であるため、リストをインプレースで変更することは問題ではありません (1. ステップ) が、結果をタプルに代入することは有効ではなく (2. ステップ)、そこでエラーがスローされます。

于 2012-05-01T11:46:38.353 に答える
8

これはhttp://bugs.python.org/issue11562にあります。

于 2012-05-01T11:56:16.017 に答える