11

次の点を考慮してください。

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

タプルが不変であることは理解していますが、LHS の項目はタプルではありません! (意図した割り当てが実際に成功したという事実は、エラー メッセージにもかかわらず、シナリオ全体をより奇妙にします。)

この動作がバグと見なされないのはなぜですか?

4

2 に答える 2

8
t[0] += [56, 78]

の略です

t[0] = t[0].__iadd__([56, 78])

tタプルはどこですか。パーツはt[0].__iadd__([56, 78])リストを変更しますが、結果を として保存できませんt[0]

Python の LHS は常に名前であり、値ではありません。すべての Python 式で、RHS が値に評価され、LHS の名前に割り当てられます。この場合、はタプルであるt[0]ため、名前を割り当てることはできません。t

于 2013-06-21T01:38:16.597 に答える
2

これは、 Python FAQ で文書化および説明されています。

完全な議論については、FAQ エントリをお読みください。しかし、簡単に言うと、問題は次のコードです。

t[0] += [56, 78]

…これと同等です:

t[0] = t[0].__iadd__([56, 78])

はインプレースを__iadd__正常に変更し、listそれ自体を返します。次に、割り当てによって例外が発生します。

これは、 、、およびすべての動作の不可避な結果であるため、バグとは見なされません。これら3つのことを理解していない人には明らかではありませんが、物事を変更しようとする試みは、理解していた人にとってははるかに明白ではありません (そして、他の多くのより重要なケースを壊す可能性があります)。+=list.__iadd__tuple

于 2013-06-21T01:53:52.797 に答える