2014-03-04 26 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 
>>>