2016-03-03 88 views
-2

我碰到的東西我不太用在DEF函數的參數是如何工作的理解:默認值[異常]:爲功能參數

即:

def test(a=1, b=9, c='what'): 
    return a 

test(a,b,c) 

--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-295-937fe43dbbd5> in <module>() 
     2  return a 
     3 
----> 4 test(a,b,c) 

NameError: name 'a' is not defined 

def test(a=1, b=9, c='what'): 
    return a 

test('what') 

Output: 'what' 

那麼,我期待設置參數a,b作爲默認值。現在,對於第一個示例,如果我調用test(a,b,c),它表示a沒有定義。但是,我已經在函數參數中「定義」了它?這意味着,如果我們說a,b和c是默認參數,我不能執行測試(a,b,c)?只有test()有效嗎?什麼!

在例2中,我甚至不知道了......

回答

2

的問題是,你想打電話給你的方法有三個變量的測試,讓您運行的是這不會在全球範圍內存在方法。

您要定義方法的方式:

def test(a=1, b=1, c=1) 

並不意味着a, b, c可用的參數在全球使用您要使用它們的方式。

通過將您的方法定義爲a=1, b=1, c=1,您可以將默認值設置爲您的參數。這意味着,你可以調用你的方法,無論是否傳遞參數給你的方法。

所以,你的第一個例子,你可以這樣調用:

test(a="what") 

這表明你現在正在分配「是什麼」到a和將不再持有的「1」,它的默認值。

或者,你可以簡單地調用它沒有任何參數,反過來將默認值分配給您的方法內的本地參數。所以,如果你真的這樣稱呼你的方法:

test() 

然後,默認值「1」現在將被分配給「a」。

在第二個例子中,你傳遞一個字符串,默認情況下,你的參數從你的函數定義的左邊到右邊分配。因此,當您這樣做時:

test("what") 

您正在將「what」分配給a

+0

謝謝你的洞察力。那麼,當他們說'默認參數'時,這意味着什麼呢?這是否意味着我必須將a,b,c聲明爲全局變量而不是在函數中分配= 1,b = 9,c ='whatever'? – misheekoh

+0

@misheekoh不完全。我會加上我的回答來解釋那部分。 – idjaw

+0

您可能想嘗試使用Google搜索「範圍解析」。簡而言之,當你輸入一個函數時,你輸入一個新的作用域,其中a,b和c由於缺省參數而被定義。當你調用這個函數時,你不在那個範圍內,這些變量還不存在。 –