10

次のコードスニペットを読みながら、私はすでにPythonを使用しています。

>>> a = (1,2)
>>> a += (3,4)
>>> a
(1, 2, 3, 4)

私は自問自答しました: なぜ Python のタプルは不変であり+=、それらに対して演算子を使用できるのでしょうか (または、より一般的には、なぜタプルを変更できるのでしょうか)? そして、私は自分自身に答えることができませんでした。

私は不変性のアイデアを理解しています。タプルはリストほど人気はありませんが、Python では便利です。しかし、不変であることと長さを変更できることは、私には矛盾しているように思えます...

4

3 に答える 3

32

5も不変です。不変のデータ構造がある場合、a += bは と同等a = a + bであるため、新しい数値、タプルなどが作成されます。

可変構造でこれを行うと、構造が変更されます。

例:

>>> tup = (1, 2, 3)
>>> id(tup)
140153476307856
>>> tup += (4, 5)
>>> id(tup)
140153479825840

どのようにid変化したかご覧ください。つまり別物です。

list変更可能な を使用するようになりました。

>>> lst = [1, 2, 3]
>>> id(lst)
140153476247704
>>> lst += [4, 5]
>>> id(lst)
140153476247704

id同じことを言っています。

于 2013-09-25T21:46:16.500 に答える
6

+=オブジェクトをインプレースで変更するかどうかは、オブジェクト次第です。同じオブジェクトを指す別の変数を作成するとわかるように、タプルを使用すると、オブジェクトを変更しません。

>>> x = (1, 2)
>>> y = x
>>> x += (3, 4)
>>> y
(1, 2)

リストなどの変更可能なオブジェクトでは、値が変化し、すべての名前の下に表示されることがわかります。

>>> x = [1, 2]
>>> y = x
>>> x += [3, 4]
>>> y
[1, 2, 3, 4]
于 2013-09-25T21:49:26.317 に答える
2

あなたはそれを変更していません。新しいタプルを作成し、a変数の内容を変更しました

a[0] = a[0] + 1不変性を見てみよう

于 2013-09-25T21:47:21.813 に答える