Python 如何让gobject.idle_add()通过引用传递参数?

Python 如何让gobject.idle_add()通过引用传递参数?,python,multithreading,variables,pygtk,Python,Multithreading,Variables,Pygtk,我的PyGTK应用程序中有两个线程: 运行GTK循环并完成所有GUI工作的主线程 处理网络请求等的另一个线程 我需要让第二个线程从第一个线程获取一些信息,因此我调用: variable = None gobject.idle_add( function_in_main_thread, variable ) 在主线程中,我有: def function_in_main_thread( variable ): variable = 1 问题是,第二个线程中的变量从未设置。它的值保持为

我的PyGTK应用程序中有两个线程:

  • 运行GTK循环并完成所有GUI工作的主线程
  • 处理网络请求等的另一个线程
我需要让第二个线程从第一个线程获取一些信息,因此我调用:

variable = None
gobject.idle_add( function_in_main_thread, variable )
在主线程中,我有:

def function_in_main_thread( variable ):
    variable = 1
问题是,第二个线程中的变量从未设置。它的值保持为
None
。那么,如何让主线程实际修改另一个线程中的变量呢


注意:脚本中有一些线程同步代码,以防有人担心修改其他线程中的变量。我从这个例子中省略了它,因为我觉得它实际上不适用于真正的问题。

在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]
当然,该列表也可以只是一个带有“value”成员的空对象

简而言之,如果要执行类似于通过引用调用的操作,请避免赋值运算符。改用对象的某种方法


这里有一本斯鲁塔什·巴苏(Shrutashi Basu)的简洁简洁的作品,以防你想深入挖掘。要了解赋值运算符正在执行的操作,请查看。它还解释了为什么在Python中不能重载赋值运算符



另外,正如您所指出的,您需要调用
gobject.threads\u init()

,很抱歉我花了一点时间才接受这一点,但再次感谢您对变量名如何工作的如此出色的解释。