2014-01-14 71 views
-1

這不起作用:(全局名稱 '一' 是沒有定義)爲什麼這個工程在python中有時? (可變範圍)

if True: 
    a = 3 
else: 
    a = 4 
print a 

這工作:

class A: 
    def f(self): 
    if True: 
     a = 3 
    else: 
     a = 4 
    print a 

A().f() 

這不起作用:(全局名稱「一'沒有定義)

class A: 
    def __init__(self): 
    a = 3 
    def f(self): 
    print a 

A().f() 

爲什麼它在一種情況下而不在另一種情況下工作?我認爲,如果它在(2)的情況下工作,那麼這是因爲a進入類上下文,但這並不使它在(3) 工作我看到其他討論,但我不明白所說的一切,情況各不相同。

編輯:

例1不工作,至少在一個python 2.7解釋器。這就是爲什麼當你在一個函數中創建一個變量這樣的例子1和2是矛盾的

+2

第一個示例**可以工作。總是定義'a'。 –

+1

在上例中,'a'是'__init__'中的局部變量。函數中的局部變量在函數作用域之外是不可見的。無論是'f'還是'__init__'都是同一個類中的方法,它們不會共享其本地名稱空間。 –

+1

@MartijnPieters第一個例子在我的機器上不起作用。我正在使用解釋器,如果它有所作用 – Thomas

回答

1

,這樣

def __init__(self): 
    a = 3 

只會內的功能訪問。這就是爲什麼1和2都在工作。在第三種情況下,您在一個函數中創建一個局部變量,並試圖在另一個變量不可見的函數中訪問它。這就是它失敗的原因。

爲了使第三殼體工作時,變量添加到當前對象(self),像這樣

def __init__(self): 
    self.a = 3 

而這必須與當前對象僅

def f(self): 
    print self.a 
訪問

編輯:

關於第一條語句,如果您執行if..else d的print語句這樣的,它工作正常

>>> if True: 
...  a = 3 
... else: 
...  a = 4 
... 
>>> print a 
3 
+1

謝謝,但請參閱編輯。我知道'self.'來創建變量實例,但是如果考慮到在解釋器中嘗試時它不起作用,問題就完全不同了。 – Thomas

+1

@Thomas請在我的解決方案中查看我的編輯,這也表明第一種情況也是如此產生有效輸出 – thefourtheye

1

在第三示例中,a是在__init__局部變量並且當方法結束被丟棄。在類,你需要使用self.a保持它周圍:

class A: 
    def __init__(self): 
    self.a = 3 
    def f(self): 
    print self.a 

你的其他實際例子都工作,因爲在這兩種a在本地定義和相同的範圍內打印。從我的翻譯器(2.7.3)複製粘貼示例1:

>>> if True: 
    a = 3 
else: 
    a = 4 


>>> print a 
3 
+1

請參閱編輯。我知道'self.'來創建一個變量實例,但是如果考慮到在解釋器中嘗試時它不起作用,問題就完全不同了。 – Thomas

+1

我已經粘貼了從例1中解釋器得到的確切結果,no 'NameError' – jonrsharpe

相關問題