2016-03-03 90 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由于缺省参数而被定义。当你调用这个函数时,你不在那个范围内,这些变量还不存在。 –