2012-02-12 32 views
0

更新:抱歉,我錯了我的問題。它是由於我試圖使這個函數平行並且有多個過程改變同一個字典。我如何設計我的功能,以便它可以這樣做?如果我必須發送詞典(在這種情況下),那麼它會自我覆蓋,不能跨越所有核心。我很高興重新設計這個功能,但不知道我該怎麼做,仍然將它傳播到多個內核上。如何從函數內引用外部變量?

爲了簡化,我基本上有類似如下:

list = [1,2,3,10] 
dictionary = {} 
for x in list: 
    for xx in range(100): 
     for xxx in range(100): 
      dictionary[x]=xx*xxx 

這個工作,但是當我換for循環的功能,我得到: NameError:全局名稱「字典」沒有定義

def test(x): 
     for xx in range(100): 
      for xxx in range(100): 
       dictionary[x]=xx*xxx 

我知道這事做與命名空間,但我不想送變量函數在這種情況下,因爲我認爲它會覆蓋變量字典。如何在函數中引用字典變量?我問的原因是我想創建一個跨越多個CPU的進程,所以我不想在每個函數中聲明變量。

我使用的功能,但如果我需要使用類或有另一種方法來解決這個問題,那麼請我知道,我會重新考慮我的方法。

回答

3

再試一次:

lst = [1,2,3,10] 
dictionary = {} 
def test(x): 
    for xx in range(100): 
     for xxx in range(100): 
      dictionary[x]=xx*xxx 

for x in lst: 
    test(x) 

你只有一個NameError當沒有定義的名稱。它與示波器無關。

+0

啊你right..I試圖在它自己和它的工作。我正在嘗試使用我已經擁有的一個過程並將其包裝到上面的函數中,以便我可以使用pp模塊對其進行多個cpus工作。似乎在我使用它創建作業時發生。 – Lostsoul 2012-02-12 02:32:05

2

How can I reference a outside variable from within a function?

不要。將其作爲參數傳遞。

+0

但我想避免必須傳遞大量參考變量 – Lostsoul 2012-02-12 02:38:12

+1

爲什麼你期望需要「一噸」他們?也許你的功能需要重新設計。 – 2012-02-12 02:40:53

+0

例如,假設我有一個函數和一個計數器來計算它成功的次數。如果我通過多個cpus分發作業,則每次創建新進程時,將其發送到每個函數都會重新啓動計數器。 – Lostsoul 2012-02-12 02:43:57

0

儘量避免全局變量,並傳遞到需要該函數的變量:

>>> def test(x, dictionary): 
...  for xx in range(100): 
...   for xxx in range(100): 
...    dictionary[x] = xx * xxx 
... 
>>> list_of_numbers = [1, 2, 3, 10] 
>>> dictionary = {} 
>>> 
>>> for x in list_of_numbers: 
...  test(x, dictionary) 
... 
>>> print dictionary 
{1: 9801, 2: 9801, 3: 9801, 10: 9801} 

我已經改名爲list,因爲它是一個Python的內置。

這可以清楚地簡化爲:

>>> for x in list_of_numbers: 
...  dictionary[x] = 99 * 99 
相關問題