私はPythonの初心者です(とにかくプログラミングについてはあまり知らない)が、Pythonは値をコピーしないので、a = bはbをbにします。実行した場合python byRef // copy
a = 1
b = a
a = 2
print(b)
結果は1になりますか?2でないはずですか?
私はPythonの初心者です(とにかくプログラミングについてはあまり知らない)が、Pythonは値をコピーしないので、a = bはbをbにします。実行した場合python byRef // copy
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
などの不変オブジェクトとは対照的に、この全体の区別は本当に最も重要です。
ここで、次のコードを考えてみましょう。あなたはb = a
を実行すると
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が参照する同じ値を参照することができます。その後、a = 2
を実行すると、新しい値を参照します。 bは影響を受けない。 Pythonでの割り当てについて
ルール:
割り当ては、単に名前が値を参照することができます。
名前への割り当ては、古い値を参照する他の名前には影響しません。
データが暗黙的にコピーされることはありません。
小さな変更を1回だけ行うだけで、あなたが期待していたことが分かります。 2つの変数は、実際には同じオブジェクトを指し示し始めます。そのオブジェクトが変更可能な場合は、両方の場所で同時に変更を見ることができます。あなたはあなたの例でやった
>>> a = [1]
>>> b = a
>>> a[0] = 2
>>> print b
[2]
それはもはやオブジェクト1
にではなく、オブジェクト2
と呼ばれるようにa
を変更しないことでした。それでもb
は1
を参照しています。
@mgilsonは素晴らしいanswerを持っていますが、わかりにくいです。私はこの答えを別の方法で説明しようとしています。
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.
清算していただきありがとうございます – user1266138
その説明をいただきありがとうございます。私はa = 2と考えていましたが、1から2を指しているものはすべて変更しますが、あなたの言うところからは、aがどこを指しているかが変わりそうです( – user1266138
@ user1266138 - はい。それはそれを考える適切な方法です。 (しかし、私たちは通常、 "ポイント"とは対照的に "参照"と言っていますが、それは単に意味論です)。 – mgilson