2015-10-23 70 views
2

我不能完全找到導入自己的文件時導入如何工作的很好的描述。導入python和全局變量中的其他文件

我在導入帶有全局變量的文件時遇到了問題,並且在將全局變量放在文件主函數之前時,我設法讓它工作。

有人可以解釋它爲什麼這樣工作嗎?

快速瞭解如何導入實際工作。

當我這樣做(僞)它沒有工作:

文件1:

import file2  
file2.main() 

文件2:

main(): 
    glob_var = 0 

    def add(): 
     global glob_var 
     glob_var += 1 

    add() 

但是,如果我第一次把變量工作像這樣:

file1的:

import file2  
file2.main() 

file2的:

glob_var = 0 

main(): 
    def add(): 
     global glob_var 
     glob_var += 1 

    add() 
+1

這與導入無關。您需要先定義實際的全局變量,然後才能通過'global'關鍵字引用它。 –

回答

2

'main' 只是的方法。根據定義,方法內部的變量是本地的。這就是爲什麼第二種方式工作。

1

它沒有工作的原因是因爲你在main中聲明瞭全局變量。 (你在主定義之後錯過了冒號,這讓它感到困惑,但是看着縮進,我想這是一個定義)。全局變量必須在任何本地函數的範圍之外定義。這是嵌套函數定義的一種情況。

你也可以不用全局變量,如果這就是你想要的。然而,如果你想使用在主定義的嵌套函數內部的變量,那麼你可以做到以下幾點: 在Python 3還有就是要這個東西使用nonlocal關鍵字

def main(): 
    var = 10 
    def nested_fun(): 
     nonlocal var 
     var = var + 1 

正如你看到的卻做了一個辦法我們在這裏不需要全局變量。

編輯:在python 2的情況下,這是行不通的。但是,您可以在main中使用列表,並在嵌套函數內修改該列表。

def main(): 
    var = [10] 
    def nested_fun(): 
     nonlocal var 
     var[0] = var[0] + 1 
0

如果我正確地理解了這個問題,它是關於全局變量,並且與導入無關。

如果你想定義一個全局變量,它必須在模塊級定義。 main函數不是全局作用域,這就是爲什麼第一個代碼不能按預期工作的原因。通過將變量聲明移到main之外,它將在全局範圍內定義,因此add方法可以使用全局變量來訪問它。

0

我認爲我們必須從global聲明的含義開始。從文檔:

這意味着列出的標識符將被解釋爲全局。

重要的一點是它只是關於解釋,即global不會產生任何東西。這就是爲什麼你的第一個例子不起作用的原因。您正試圖將+1添加到不存在的內容。 OTOH,global_var = 100會在那裏工作,它會創建一個新的全局變量。