2013-06-04 17 views
3

IPython如何處理局部變量?我有這個函數可以在Python shell中工作,但不會在IPython shell中工作。如何在IPython中使用全局變量

def change(key,value): 
    global aname 
    global alist 
    alist.append(key) 
    aname.extend(value) 

我用這一個for循環內部,並從JSON和其他.txt文件讀取輸入並添加鍵和值的列表,然後使用其他功能保存到數據庫。如果我不這樣做,它會變得醜陋,並會在我的循環中使用索引。

[change(key,value) for key,value in jsondata.itervalues()] 

def storeindatabase(): 
    do_sothing to the list aname and store 
    do_sothing to the alist and store 
+0

我在for循環中使用這個內部,它正在讀取從json和其他txt文件輸入並將鍵和值添加到列表中,然後由另一個函數將其用於保存到數據庫。如果我沒有這樣做,它會是醜陋的,我的循環 – user1940979

+1

使用索引無關緊要。如果你不使用'='來分配函數中的名字,'global'什麼也不做。 – geoffspear

+0

protip句子的第一個單詞一般是大寫的句號或其他終端標點符號通常跟在幾乎不可能讀的句子一起運行請幫助我們閱讀寫更好 – kindall

回答

0
  1. 使用全局意味着錯誤的工程。如果你需要一個全局的,那意味着你需要重新設計你的代碼。在python中更是如此。
  2. 當你做真的想要使用全局(也許是唯一可接受的情況:單身,雖然在python中,你只能在全局範圍內比單獨使用它的範圍...),你需要聲明你的變量作爲全局變量,然後爲它賦值。

例如:

global bar 
    bar = [] 
    def foobar(): 
    bar.append('X') 

RTFM:

關於IPython中的一部分,我的例子做的工作:

In [1]: global bar 

In [2]: bar = [] 

In [3]: def foo(): 
    ...:  bar.append(3) 
    ...:  

In [4]: foo() 

In [5]: foo() 

In [6]: foo() 

In [7]: bar 
Out[7]: [3, 3, 3] 

,這裏是另一個例子,顯示了全球確實是工作,而不是outter作用域:

In [2]: def foo(): 
    ...:  global bar 
    ...:  bar = [] 
    ...:  

In [3]: def oof(): 
    ...:  bar.append('x') 
    ...:  

In [4]: foo() 

In [5]: oof() 

In [6]: oof() 

In [7]: oof() 

In [8]: oof() 

In [9]: bar 
Out[9]: ['x', 'x', 'x', 'x'] 

反正全局是邪惡

+1

你可以嘗試你自己的例子在ipthon它不會工作,這是我想知道的以及爲什麼感謝 – user1940979

+15

iPython筆記本電腦經常用於修補新問題。在這種情況下使用全局變量沒有任何問題。這不是寫拋光代碼,而是關於@ user1940979給出的具體情況不起作用的原因。 – Thucydides411

+0

好吧,我每天使用Python REPL來修補新問題(甚至是舊問題),而且我從來沒有從Python的角度看全局變量。當然,就像大家一樣,我會濫用'__main__'範圍,在那裏我聲明我正在使用的所有變量,這些變量是函數的模型參數,或者是我正在處理的數據集變量。但我的經驗是,無論你在REPL中「修飾」了什麼,它都可能以腳本結尾。所以很少有任何理由使用Python全局變量,因此正確使用範圍總是更好。 – zmo