2015-01-09 104 views
1
def func(): 
     global x 
     print 'x is', x 
     x = 2 
     print id(x) 
     print 'Changed global x to', x 

x = 50 
print id(x) 
func() 
print 'Value of x is', x 
print id(x) 

輸出蟒蛇身份全局變量

32308172 
x is 50 
32308748 
Changed global x to 2 
Value of x is 2 
32308748 

我期待id()應該因爲x同一副本是全球使用的所有的所有三次返回相同的值。爲什麼它的行爲如此。

+0

整數是不變的,而'global'指**姓名**'x',沒有任何潛在的對象恰好是分配給。看看例如http://nedbatchelder.com/text/names.html – jonrsharpe

+0

它是對象的ID,而不是變量的ID。在CPython中嘗試:'a = 1'' id(a)''b = 1'' id(b)' – Roberto

+0

@Roberto,這個例子可能會給出令人困惑的結果,因爲小整數是* interned *。 – jonrsharpe

回答

3

Python中的「變量」只是您附加到對象的標籤。函數id()返回傳遞給它的對象的ID,而不是「變量」的ID。如果您將一個名稱指向另一個對象,您將得到一個不同的ID。

+0

對不起,我不理解。我在想的是,如果我們使用「全局」關鍵字,通過查看該名稱將不會創建其他內存位置,應使用x的相同內存位置(在函數外部定義)。假設id()返回內存位置。 – user1423015

+0

@ user1423015:不,名稱並不是指Python中的內存位置,不管全局與否。名稱只是一個標籤,可以附加到可打印對象。您可以將多個名稱附加到同一個對象,而不會有任何問題。全局關鍵字聲明某個名稱是* scoped *全局的,這與內存位置完全無關。這隻意味着如果您重新分配該名稱,全局名稱將被附加到不同的對象,而不是創建一個新的本地名稱。 –

0

更改x值的原因是因爲您在函數中將x定義爲global,所以python威脅將x作爲模塊範圍內的全局變量,並且對象的id將更改爲整數是不可變的,分配python後爲你的對象創建一個新的地址。

如果你不使用的功能,你會看到同樣的結果:

>>> x=2 
>>> id(x) 
33263936 
>>> x=4 
>>> id(x) 
33263888