2014-03-04 28 views
7

我的问题是为什么我不能再次调用该函数?或者,如何做到这一点?Python:功能和变量同名

假设我有这样的功能:

def a(x, y, z): 
if x: 
    return y 
else: 
    return z 

我这样称呼它:

print a(3>2, 4, 5) 

我得到4

但是想象一下,我声明一个变量具有相同名称功能(错误):

a=2 

现在,如果我尝试做:

a=a(3>4, 4, 5) 

或:

a(3>4, 4, 5) 

我会得到这个错误: “类型错误: '诠释' 对象不是可调用的”

这是不可能的将变量'a'分配给函数?

+0

好吧,错误解释了它自己。你已经将'a'重新定义为'int'而不是'function';现在,'a'是一个变量(而不是一个函数);因此后果 – mshsayem

+0

我不确定你在问什么。你问你为什么不能拨打一个号码? –

+0

不,我只想知道的是:如果可能在分配“a = 2”之后,还有一些方法可以再次将“a”指向该函数。 – dvsaraiva

回答

13

后你这样做:

a = 2 

a不再是功能,它只是一个整数(你重新分配它!)。所以很自然,如果你尝试调用它,仿佛它是一个函数的解释会抱怨,因为你这样做:

2() 
=> TypeError: 'int' object is not callable 

底线:你不能有两件事情同时具有相同名称,它可以是一个函数,一个整数或Python中的任何其他对象。只需使用不同的名称。

3

您将名称a分配给函数定义,然后将其重新分配给一个整数。

它在语法上是正确的,但它不是你想要的。

最好给函数提供语义名称,描述你在传递给它们的参数时做了什么,并给出变量的语义名称来描述它们指向的对象。如果你这样做,你会有更多的可读代码,你肯定不会再犯这个错误。

5

python中的'names'通常是特定类型的标识符。更像是命名一个存储变量/函数/方法或python中的任何对象的框。 当你重新分配时,你只是重命名一个盒子。

您可以通过执行以下操作来找到该问题。

最初被只要我使用相同的标识符的函数分配有值9,在位置140515915925784. ,一个现在是指含有该功能(4512942512)

重新分配的地址的框再次给3指出一个不同的地址。

>>> a = 9 
>>> id(a) 
140515915925784 
>>> def a(x): 
...  return x 
... 
>>> id(a) 
4512942512 
>>> a 
<function a at 0x10cfe09b0> 
>>> 
>>> 
>>> 
>>> a = 3 
>>> id(a) 
140515915925928 
>>> a 
3 
>>>