2011-05-01 14 views
2

我在我的PyGTK應用兩個線程:如何讓gobject.idle_add()通過引用傳遞參數?

  • 它運行的GTK循環,完成了所有的GUI東西
  • 另一個線程負責處理網絡請求等

我主線程需要有第二個線程獲取來自第一線的一些信息,所以我呼籲:

variable = None 
gobject.idle_add(function_in_main_thread, variable) 

在主線程我有:

def function_in_main_thread(variable): 
    variable = 1 

問題是第二個線程中的變量永遠不會被設置。它的價值仍然在None。那麼我怎樣才能得到主線程修改變量在其他線程?

注意:我在腳本中有一些線程同步代碼,以防有人擔心修改其他線程中的變量。我從這個例子中省略了它,因爲我覺得它確實不適用於真正的問題。

回答

3

在Python中,賦值總是在當前範圍內創建名稱。您傳遞的名稱實際上是對您創建的變量的引用,但賦值運算符將嘗試在當前範圍中找到它,如果它不在那裏,則創建它。

>>> def assign_to(name, value): 
...  name = value 
... 
>>> name = "nothing" 
>>> assign_to(name, 5) 
>>> name 
'nothing' 

您可以改爲傳遞某種實例,類型或甚至列表的引用,然後使用該實例的某種方法。

>>> def append_to_list(my_list, value): 
...  my_list.append(value) 
... 
>>> my_list = [] 
>>> append_to_list(my_list, 5) 
>>> my_list 
[5] 

該列表當然可以只是一個帶有「值」成員的空對象。

總之,如果你想做一些類似於通過引用調用的東西,避免賦值運算符。改用對象的某種方法。


有一個整潔,並通過Shrutarshi巴蜀出奇的簡潔guide to Python Namespaces,如果你想更深入。爲了解分配操作員正在做什麼,請查看wp: Name Binding。它也解釋了爲什麼賦值運算符不能在Python中重載。


此外,如指出的那樣,你需要調用gobject.threads_init()

+0

對不起,我花了一點接受這個,但再次 - 感謝大家對如何變量名工作如此出色的解釋。 – 2011-05-01 04:43:29