6

私はPythonを初めて使用しますが(とにかくプログラミングについてはよくわかりません)、Pythonは通常値をコピーしないため、a=bのステートメントはbがaを指すことを覚えています。私が走ったら

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

結果は1になります。2ではないでしょうか。

4

4 に答える 4

11

いいえ、結果は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

この全体の区別は、、、、などの不変オブジェクトとは対照的に、などの可変オブジェクトを処理する場合に最も重要です。listsintfloattuple

ここで、次のコードについて考えてみます。

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.
于 2012-07-27T14:52:23.333 に答える
3

を実行するb = aと、bはaが参照するのと同じ値を参照します。次に、を実行するa = 2と、新しい値を参照します。bは影響を受けません。

Pythonでの割り当てに関するルール:

  1. 割り当ては、名前が値を参照するようにするだけです。

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

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

于 2012-07-27T14:54:12.927 に答える
2

@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.
于 2012-07-27T14:58:30.697 に答える
0

わずか1回の変更で、期待していたことがわかります。2つの変数は実際に同じオブジェクトを指していることから始まり、そのオブジェクトが可変である場合は、両方の場所で同時に変化を確認できます。

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

a例で行ったことは、オブジェクトを参照するのでは1なく、オブジェクトを参照するように変更することでした2。それはbまだを参照して残った1

于 2012-07-27T14:56:32.050 に答える