2017-08-26 63 views
-4

例如,爲什麼不能修改先前提到「無」的變量?

def function(data=None): 
    print(data,id(data)) 
    if data is None: 
     data=[] 
    print(data,id(data)) 

    data.append(1) 
    print("==================") 

function() 
function() 

>> None 1781798096 
[] 1780266168520 
================== 
None 1781798096 
[] 1780266174856 
================== 

在的function()第一執行,可變data指「無」對象(ID:1781798096)按代碼的第三行,現在data指空的列表對象(ID :1780266168520)在的function秒執行,data預計將有值1780266168520.的ID,但出人意料的是,它給出1781798096這是當data所指的「無」對象相同的值。

但是,如果我們改變默認的參數有些武斷名單,說[0],

[0] 1780266149960 
[0] 1780266149960 
================== 
[0, 1] 1780266149960 
[0, 1] 1780266149960 
================== 

,我們發現,它給了相同的ID值。

所以我的問題是,爲什麼我們不能修改這在以前被稱爲「無」對象的變量,爲什麼發生這樣的區別,如果我們設置默認參數設置爲「無」,[0]?

+1

你的問題是沒有意義的。你在問爲什麼局部變量不能在函數調用中保留它們的值? – melpomene

+0

@melpomene如果您將默認參數更改爲某個任意列表,您將發現id值完全相同。爲什麼在將默認參數設置爲「無」時出現這種差異? – Jin

+0

我不明白你在說什麼。 – melpomene

回答

3

如果你問爲什麼dataid值最初是相同的,那是因爲默認參數在定義函數時被初始化一次,並保留在整個程序中。這也是"Least Astonishment" and the Mutable Default Argument的原因。

data重新分配,所發生的一切是它指向一個新的對象(空單),這個對象可能會或可能不會有相同的id(REPL會話經常重複使用的垃圾收集變量相同ids) 。

+0

當'data'被重新分配時,它指向一個新的對象([])。所以我猜'數據'不再指向'無',不是嗎? – Jin

+0

@Jin你說得對,它在每次賦值後指向一個不同的[]'。 –

+0

@COLDSPEED那麼如果它指向[]而不是「None」,爲什麼數據的id值與第二次執行'function'後的id值是「None」? – Jin

0

都不是一個單獨的對象,所以你不應該創建NoneType的多個對象。 (請注意,您可以創建單個類的多個對象)。在python中,你並不總是改變它所持有的值,你可以在對象上調用方法,修改它,或者創建新的對象併爲變量賦值。以前,它在保存對None對象的引用時,將其更改爲其對其他對象的引用。同樣當你再次分配None時,參考None的python初始化參考值。

0

您調用函數不帶參數,所以在進入function()當它被設置爲None。 當你想保留的data值,你需要將它在第二次調用返回data變量,然後傳遞給function()

相關問題