2016-07-18 3 views
1

Pythonチュートリアル9.2によると。 Pythonスコープとネームスペース:割り当ては名前をオブジェクトにバインドするだけですか?

割り当てはデータをコピーしません。オブジェクトに名前をバインドするだけです。

は、だから私は、次のコードは、私は驚かないことに驚いている:

>>> a = 42 
>>> b = a 
>>> b = b/2 
>>> a 
42 
>>> b 
21 

割り当てb = aは、名前だけですでにaにバインドされているintオブジェクト42、へbを結合すれば、 ab = b/2の後に実行すると、abは同じオブジェクトを参照するため、21にならないはずですか? B = B/2の後

+0

いいえ、あなたは**リバウンド**の名前を持っています。整数は不変です。これを読んでください:http://nedbatchelder.com/text/names.html – jonrsharpe

+0

オブジェクトには名前がありません。名前にはオブジェクトがあります。 – erip

+0

@eripあなたはオブジェクトが多くの異なる名前を持つことができますが、名前は1つのオブジェクトのみを参照できることを意味しますか? –

答えて

3

です:

b = b/2 

int(不変)タイプの操作がするので、常に新しいオブジェクトを返します。元の値に変更はありません何でも操作があります。

これは特定操作で変更することができます可変タイプ、すなわち増補割り当て操作は変更はその場で作られていたために異なります。これがないことを当然の

>>> a = [20] 
>>> b = a 
>>> b += [1] 
>>> b 
[20, 1] 
>>> a 
[20, 1] 

注意、名前は、新しいオブジェクトを参照intのためのようであった単純な代入で行われます。ここでは

>>> b = b + [1] 
>>> b 
[20, 1, 1] 
>>> a 
[20, 1] 
2

、bはまあ、あなたがbに別の割り当てを作るのですか、新しいオブジェクト

>>> a = 42 
>>> id(a) 
8006428 
>>> b = a 
>>> id(b) 
8006428 
>>> b = b/2 
>>> id(b) 
8006680 
0

はそれの痕跡である:

>>> a = 42
= 42
bは

>>> b = a
= 42
B =

>>> b = b/2
= 42
B = 21

未定義です操作b = b/2は、aの時点でbを使用して新しいオブジェクトを作成しています。 aを含む操作で新しい値を作成するだけでは、aは変更されません。現在、baを参照していませんが、aを使用して新しい値が作成されます。

関連する問題