2015-01-03 27 views
0
def func(x): 
    print "inside function" ,id(x) 
    x = 2 
x = 50 
print "outside function" ,id(x) 
print 'Value of x before function call is', x 
func(x) 
print 'Value of x after function call is', x 

輸出:蟒整數參數值不會改變,即使雖然ID()是在相同的主叫和被叫功能

outside function 6486996 
Value of x before function call is 50 
inside function 6486996 
Value of x after function call is 50 

假設id()給出對象的內存位置。儘管兩者都保存在同一位置,但如果x值在func()中更改,則不會在外部影響。

回答

3

啊,但函數中的id(x)調用引用了傳遞給該函數的全局x,但x = 2創建了一個新的本地x。試試這個:

def func(x): 
    print "inside function", id(x) 
    x = 2 
    print "still inside function", id(x) 

x = 50 
print "outside function" , id(x) 
print 'Value of x before function call is', x 
func(x) 
print 'Value of x after function call is', x 

典型輸出

outside function 168950596 
Value of x before function call is 50 
inside function 168950596 
still inside function 168951172 
Value of x after function call is 50 
+0

謝謝@ user590028!我不知道這是怎麼發生的... –

0

如果u想知道更多一點,我覺得你需要充分了解基本的蟒蛇。

點關於你的問題:

可變對象作爲參數

功能獲取該對象的引用,並可能發生變異,但如果你重新綁定方法中的引用,外部範圍在完成之後一無所知,外部參照仍然指向原始對象。

不變對象作爲參數

仍不能重新綁定外部引用,並且甚至不能突變此對象。

更新評論:所以你傳遞x(整數不可變)函數調用,你不能改變這個對象。並且你重新綁定了x在函數中引用,外層作用域一無所知,做完之後,外層引用仍然會指向原來的整數50個對象。

+0

由於重新綁定是在這裏發生的,所以在這種情況下不需要區分可變和不可變。 – glglgl

+0

另外,整數在Python中是不可變的,這就是爲什麼它們可以被實現的原因。 –

0

一個賦值通常會改變名稱和對象之間的綁定(當然,如果你沒有這樣做,就像x = x)。它沒有做對象上的任何改變(因爲它們是不可變的,其不會對int的工作,無論如何,但正如一個側面說明)

因此,在這種情況下,你x的功能點內到50對象直到你改變它。然後它指向一個不同的對象。對象本身不受影響。

要指出什麼一步發生步驟:

  • x點爲int對象具有值50
  • 函數調用:內部x指向同一對象
  • 內部x被改變爲指向不同的對象,有價值2
  • 回報:外x仍指向50.