在Python中,函數是數據,鍵入是動態的。這意味着下面幾行是有效的Python:
def func(x):
return x + 3
func = 3
func
現在是int類型。原始功能func
不再被引用。 func
最初是一項功能,這一事實對於將來可以分配哪些類型的數據沒有任何影響。 (這是「動態類型」的意思)。
因此,由於沒有靜態類型,「函數」是一個有效的數據類型,因此Python解釋器區分函數和由相同名稱引用的一段數據。因此,在給定的範圍內,沒有辦法使用相同的非限定變量名來表示兩個不同的事物。
在您的特定情況下,如果在你的xplus1
函數的代碼意味着什麼,那將意味着「計算的xplusy(x,1)
價值和分配是看重給變量xplusy
- 從而失去了參考功能xplusy
「。但是,在函數範圍內,解釋器不會讓您對該範圍之外的變量進行賦值,因此它假定通過編寫賦值語句,引入一個新的局部變量xplusy
。但是,局部變量尚未定義,因此您嘗試調用它,xplusy(x,1)
失敗。全局定義的函數不被稱爲回退函數,因爲再次,您不能將兩個非限定名稱相同並指向同一範圍內的不同數據。
另一個例子展示了規則(我實際上同時與提示我試圖構建這樣的回答玩弄纔剛剛發現)「一個範圍內的變量名沒有重複」:
>>> def f1():
... a = xplusy(3,4)
... xplusy = 5
... print xplusy
...
>>> f1()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f1
UnboundLocalError: local variable 'xplusy' referenced before assignment
>>> def f1():
... a = xplusy(3,4)
... print a
...
>>> f1()
7
這表明它確實是需要唯一名稱的範圍,而不是陳述。
編輯:這是一個非常酷的職位,說明這一點和其他範圍界定相關行爲:http://me.veekun.com/blog/2011/04/24/gotcha-python-scoping-closures/
爲什麼給你的生活複雜化?請給它另一個名字。 – Maroun 2013-04-22 06:50:26
你可以這樣做'return xplusy(x,1)':'def xplus1(x):return xplusy(x,1)' – 2013-04-22 06:52:07
在其他語言中通常是很自然的事情。改變它並不是一個問題,但如果它是一個向代碼中添加幾個字符的問題,我很好。爲什麼它發生在理論上還不清楚...... – sashkello 2013-04-22 06:52:20