私はPythonを初めて使用しますが(とにかくプログラミングについてはよくわかりません)、Pythonは通常値をコピーしないため、a=bのステートメントはbがaを指すことを覚えています。私が走ったら
a = 1
b = a
a = 2
print(b)
結果は1になります。2ではないでしょうか。
私はPythonを初めて使用しますが(とにかくプログラミングについてはよくわかりません)、Pythonは通常値をコピーしないため、a=bのステートメントはbがaを指すことを覚えています。私が走ったら
a = 1
b = a
a = 2
print(b)
結果は1になります。2ではないでしょうか。
いいえ、結果は1になります。
代入演算子(=
)は、参照の代入と考えてください。
a = 1 #a references the integer object 1
b = a #b and a reference the same object
a = 2 #a now references a new object (2)
print b # prints 1 because you changed what a references, not b
この全体の区別は、、、、などの不変オブジェクトとは対照的に、などの可変オブジェクトを処理する場合に最も重要です。lists
int
float
tuple
ここで、次のコードについて考えてみます。
a=[] #a references a mutable object
b=a #b references the same mutable object
b.append(1) #change b a little bit
print a # [1] -- because a and b still reference the same object
# which was changed via b.
を実行するb = a
と、bはaが参照するのと同じ値を参照します。次に、を実行するa = 2
と、新しい値を参照します。bは影響を受けません。
Pythonでの割り当てに関するルール:
割り当ては、名前が値を参照するようにするだけです。
名前への割り当ては、古い値を参照する他の名前に影響を与えることはありません。
データが暗黙的にコピーされることはありません。
@mgilsonは素晴らしい答えを持っていますが、私はそれを理解するのが少し難しいと思います。私はこの答えを別の方法で説明する試みとして入れています。
a = 1 # This makes a point to a location in memory where the Integer(1) is located
b = a # This makes b point to the same place.
a = 2 # This makes a point to a different location in memory where Integer(2) is located
print(b) # b still points to the place where Integer(1) was stored, so it prints out 1.
わずか1回の変更で、期待していたことがわかります。2つの変数は実際に同じオブジェクトを指していることから始まり、そのオブジェクトが可変である場合は、両方の場所で同時に変化を確認できます。
>>> a = [1]
>>> b = a
>>> a[0] = 2
>>> print b
[2]
a
例で行ったことは、オブジェクトを参照するのでは1
なく、オブジェクトを参照するように変更することでした2
。それはb
まだを参照して残った1
。