Python で複数の変数に同じ値を割り当てるには? リストの動作 質問する

Python で複数の変数に同じ値を割り当てるには? リストの動作 質問する

変数を初期化するために、以下に示すように複数の割り当てを使用しようとしましたが、動作に混乱しました。値のリストを個別に再割り当てする必要があると思います。つまり、b[0]とc[0]は以前と同じように0になります。

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

ベストアンサー1

C/Java などの言語ファミリーから Python に移行する場合は、 をa「変数」として考えるのをやめて、「名前」として考え始めると役立つかもしれません。

a、、bは、c同じ値を持つ異なる変数ではありません。同じ値の異なる名前です。変数には、型、ID、アドレスなど、さまざまなものがあります。

名前にはそういったものは一切ありません。価値観もちろん、同じ値に複数の名前を付けることもできます。

Notorious B.I.G.ホットドッグを 1 つ与え、*ホットドッグを食べます。 の最初の要素を 1 に変更するとBiggie Smalls、との最初の要素は1 になります。Chris Wallaceabc

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

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


裏では、a[0]=1リストオブジェクトのメソッドを呼び出しています。(これは と同等ですa.__setitem__(0, 1)。)つまり、本当に何も再バインドしません。 を呼び出すようなものですmy_object.set_something(1)。確かに、オブジェクトはこのメソッドを実装するためにインスタンス属性を再バインドしている可能性がありますが、それは重要なことではありません。重要なのは、何も割り当てておらず、オブジェクトを変更しているだけであるということです。 でも同じですa[0]=1


* 警告: Notorious BIG にホットドッグを与えないでください。ギャングスタ ラップ ゾンビには、真夜中以降に餌を与えてはいけません。

おすすめ記事