1. ホーム
  2. python

[解決済み] Pythonで複数の変数に同じ値を代入する? リストの動作

2022-04-25 01:57:26

質問

変数の初期化に以下のような多重代入を使おうとしたのですが、動作に戸惑っています。

a=b=c=[0,3,5]
a[0]=1
print(a)
print(b)
print(c)

結果は [1, 3, 5] [1, 3, 5] [1, 3, 5]

複数回の割り当てには何を使用すればよいのでしょうか? これと何が違うのでしょうか?

d=e=f=3
e=4
print('f:',f)
print('e:',e)

の結果です。 ('f:', 3) ('e:', 4)

どのように解決するのですか?

C/Java/などの言語からPythonに来た人は、以下のことを考えるのをやめるといいかもしれません。 a をquot;変数"として、それをquot;名前"として考え始める。

a , b および c は同じ値を持つ別の変数ではなく、同じ同じ値に対する別の名前なのです。変数には型、ID、アドレス、その他いろいろなものがあります。

名前にはそのようなものはありません。 もちろん、同じ値に対してたくさんの名前をつけることができます。

もしあなたが Notorious B.I.G. ホットドッグ,* Biggie Smalls そして Chris Wallace はホットドッグを持っています。の最初の要素を変更すると a の最初の要素を 1 にすると bc は1である。

2つの名前が同じオブジェクトを命名しているかどうかを知りたい場合は is 演算子を使用します。

>>> a=b=c=[0,3,5]
>>> a is b
True


その後、あなたはこう尋ねます。

これと何が違うのでしょうか?

d=e=f=3
e=4
print('f:',f)
print('e:',e)

ここでは、名前を再バインドしています。 e を値 4 . それは、名前に影響を与えません。 df をどのような形であれ

前のバージョンでは、あなたは a[0] ではなく a . という点から a[0] を再バインドしています。 a[0] の観点で、しかし a ということは、インプレースで変更していることになります。

を使用することができます。 id この関数は、オブジェクトの ID を表す一意な番号を与えるものです。 is はどうしようもない。

>>> a=b=c=[0,3,5]
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261120
>>> id(b[0])
4297261120

>>> a[0] = 1
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261216
>>> id(b[0])
4297261216

注目すべきは a[0] は4297261120から4297261216に変更されている。これは別の値の名前になっている。また b[0] もまた、同じ新しい値の名前になりました。それは ab はまだ同じオブジェクトを命名しています。


アンダーザカバー a[0]=1 は、実際にはリストオブジェクトのメソッドを呼び出しています。(これは a.__setitem__(0, 1) .) つまり、これは 本当に をバインドしています。それはまるで my_object.set_something(1) . もちろん、このメソッドを実装するためにオブジェクトはインスタンス属性を再バインドしているのでしょうが、それは重要ではありません。重要なのは、何も代入していない、ただオブジェクトを変異させているだけだということです。そして、それは a[0]=1 .


user570826さんからの質問です。

あればどうでしょう。 a = b = c = 10

と全く同じ状況です。 a = b = c = [1, 2, 3] 同じ値に対して3つの名前があります。

しかし、この場合、その値は int であり、かつ int はイミュータブルです。どちらの場合でも a を別の値に変更する(例. a = "Now I'm a string!" という元の値には影響を与えません。 bc はそのままの名前になります。違いは、リストでは、値を変更することで [1, 2, 3][1, 2, 3, 4] をすることで、例えば a.append(4) という値を変更することになります。 bc は名前です。 b は今後 [1, 2, 3, 4] . の値を変更する方法はありません。 10 を他の何かに変更します。 10 は永遠に10であり、吸血鬼のクローディアが永遠に5であるように(少なくともキルスティン・ダンストに取って代わられるまでは)。


* 警告 ノトーリアスB.I.G.にホットドッグを与えないでください。ギャングスタ・ラップ・ゾンビには、真夜中以降、決して食べ物を与えてはいけない。