2013-01-03 92 views
2

我有一個有趣的(可能是愚蠢的)想法:如果我使用內置函數名稱作爲變量來分配某個對象(比如說整數)會發生什麼。這是我的嘗試:在python中使用函數名稱作爲變量

>>> a = [1,2,3,4] 
>>> len(a) 
4 
>>> len = 1 
>>> len(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
TypeError: 'int' object is not callable 

似乎python不處理函數和變量名稱不同。在不重新啓動python解釋器的情況下,是否有辦法將len指定回該函數?或取消分配len = 1

+0

Python將函數和methosd作爲第一類對象進行處理,這就是爲什麼您可以將它們分配給它們並將它們傳遞給其他函數的原因。 – 2013-01-03 23:05:50

+0

的確,Python不會以不同的方式處理函數和變量名稱。這是將函數作爲第一類對象使用的關鍵,而不必像Ruby的':func',Lisp的''func'等一樣做任何事情。 – abarnert

+2

你沒有實際覆蓋它,你掩蓋了它。只要刪除新的'len'變量就會揭示內置的名字。不需要從'__builtin__'導入。 – Keith

回答

12

從技術上講,你可以把它找回來,從__builtin__

from __builtin__ import len 

但請別姓的東西len,它使明智的程序員生氣。

好了,一開始沒有命名建宏後您的變量;其次,如果你想尊重其他功能則考慮命名空間例如

import time 
time.asctime() 
asctime = 4253 
time.asctime() # Notice that asctime here is unaffected as its inside the time module(s) namespace 
+0

我同意我不應該使用'len'作爲變量名。但是,如何確保不會覆蓋另一個模塊中定義的函數名稱? –

+0

查看上面的編輯說明 –

+1

有道理。只導入你需要的功能被認爲是不好的做法? '從時間導入asctime'這樣你可以調用'asctime()'而不用命名空間,這使我們回到了原點。 –

17

使用del len

>>> a=[1,2,3,4] 
>>> len=15 
>>> len(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'int' object is not callable 
>>> del len 
>>> len(a) 
4 

docs.python.org

刪除名稱將刪除該名稱的綁定來自本地或全局名稱空間,具體取決於名稱是否出現在同一代碼塊中的全局語句中。如果名稱未被綁定,則會引發NameError異常

+2

這很光滑。 –

+0

+1參考文檔 – vkontori

相關問題