2012-07-27 4 views
5

私はPythonの初心者です(とにかくプログラミングについてはあまり知らない)が、Pythonは値をコピーしないので、a = bはbをbにします。実行した場合python byRef // copy

a = 1 
b = a 
a = 2 
print(b) 

結果は1になりますか?2でないはずですか?

答えて

10

いいえ、結果は、基準の割り当てとして代入演算子(=)の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など可変オブジェクトを扱うときintfloattupleなどの不変オブジェクトとは対照的に、この全体の区別は本当に最も重要です。

ここで、次のコードを考えてみましょう。あなたは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. 
+0

その説明をいただきありがとうございます。私はa = 2と考えていましたが、1から2を指しているものはすべて変更しますが、あなたの言うところからは、aがどこを指しているかが変わりそうです( – user1266138

+0

@ user1266138 - はい。それはそれを考える適切な方法です。 (しかし、私たちは通常、 "ポイント"とは対照的に "参照"と言っていますが、それは単に意味論です)。 – mgilson

3

を、それはBがAが参照する同じ値を参照することができます。その後、a = 2を実行すると、新しい値を参照します。 bは影響を受けない。 Pythonでの割り当てについて

ルール:

  1. 割り当ては、単に名前が値を参照することができます。

  2. 名前への割り当ては、古い値を参照する他の名前には影響しません。

  3. データが暗黙的にコピーされることはありません。

0

小さな変更を1回だけ行うだけで、あなたが期待していたことが分かります。 2つの変数は、実際には同じオブジェクトを指し示し始めます。そのオブジェクトが変更可能な場合は、両方の場所で同時に変更を見ることができます。あなたはあなたの例でやった

>>> a = [1] 
>>> b = a 
>>> a[0] = 2 
>>> print b 
[2] 

それはもはやオブジェクト1にではなく、オブジェクト2と呼ばれるようにaを変更しないことでした。それでもb1を参照しています。

2

@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. 
+0

清算していただきありがとうございます – user1266138