2014-02-11 130 views
0

在Python是,能夠避免可變(預)聲明,以避免NameError:名稱「C」沒有定義Python的處理未聲明的變量

a=5 
if a==7: 
    c=10 
if c: print c 

在最後一行如果c:只是驗證變量'c'不是無。什麼可以用來檢查'c'變量是否存在(或者是預先聲明的)?

+1

如果僅C存在時,第一個'if'執行,爲什麼不把'打印C'在那個'if'塊裏面? – Kevin

回答

7

當然,首先分配None它:

a = 5 
c = None 
if a == 7: 
    c = 10 
if c: 
    print c 

None測試作爲False在布爾上下文,所以if c:仍然可以作爲書面。

你也可以趕上NameError例外:

try: 
    print c 
except NameError: 
    pass 

或使用globals()locals()功能:

if 'c' in locals(): 
    # in a function 

if 'c' in globals(): 
    # outside a function 

但是這只是醜陋的和不必要的。

+0

我不知道我是否可以避免c =無預申報....還有其他建議嗎? – alphanumeric

+1

@Sputnix:爲什麼?你可以嘗試看看'globals()'或'locals()'中是否有這個名字,但這很簡單。不應該預先分配什麼目標? –

+0

問題是:如果您不知道名稱是否已被定義,那麼您的代碼可能存在問題。好的代碼是由小的簡單函數組成的,儘可能地避免了全局變量,所以你應該知道。如果你不這樣做,請重構你的代碼。 –

3

您可以使用locals檢查,如果變量是在局部範圍內:

>>> c = 1 
>>> locals() 
{'__doc__': None, 'c': 1, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__builtins__': <module 'builtins' (built-in)>, '__name__': '__main__', '__package__': None} 
>>> 'c' in locals() 
True 
>>> 

您還可能有興趣在globals

6

你可能會發現異常。

+0

這在我看來似乎是最好的答案,我使用它從配置文件中檢索contants並確保它的設置正確。 –

1

目前尚不清楚爲什麼需要在某些情況下,而不是其他的變量,但最簡單的是把print遷入範圍c在分配:

if a == 7: 
    c = 10 
    print(c) 

或刪除變量:

if a == 7: 
    print(10) 
0

在python3,儘管馬亭認爲這是醜陋的:
如果你知道這個變量是一個全球性:

if globals().get('abc'): print (True) 
如果你知道這是當地

if locals().get('abc'): print (True)