変数を初期化するために、以下に示すように複数の割り当てを使用しようとしましたが、動作に混乱しました。値のリストを個別に再割り当てする必要があると思います。つまり、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 Wallace
a
b
c
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
。これは、名前d
とf
に何ら影響しません。
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]
ためです。a
b
裏では、a[0]=1
リストオブジェクトのメソッドを呼び出しています。(これは と同等ですa.__setitem__(0, 1)
。)つまり、本当に何も再バインドしません。 を呼び出すようなものですmy_object.set_something(1)
。確かに、オブジェクトはこのメソッドを実装するためにインスタンス属性を再バインドしている可能性がありますが、それは重要なことではありません。重要なのは、何も割り当てておらず、オブジェクトを変更しているだけであるということです。 でも同じですa[0]=1
。
* 警告: Notorious BIG にホットドッグを与えないでください。ギャングスタ ラップ ゾンビには、真夜中以降に餌を与えてはいけません。