python - Python:在线程中更改传递的变量并在线程外使用新值?
问题描述
抱歉,如果有人以前问过这个问题,但我目前找不到解决一个奇怪问题的方法。就像我在很多文章中阅读的那样,应该可以将变量传递给 Python 中的线程,在那里更改它,然后在调用线程中使用新值?但这对我不起作用。我在这里有一个示例代码:
from threading import Thread
def change(val):
val = False
def start():
val = True
t = Thread(target=change, args=(val,))
t.start()
t.join()
print(val) #--> stays True but should be False
start()
如果有人知道问题是什么,我很高兴得到答案。
问候白细胞
解决方案
在方法中,内存地址发生了value
变化,所以它是一个不同的对象(一个局部变量)。
为了您的目标,使用一个对象并更改一个属性,使对象地址保持不变。
试试这个代码
from threading import Thread
def change(val):
val[0] = False # list address stays the same, update attribute
def start():
val = [True] # list object
t = Thread(target=change, args=(val,))
t.start()
t.join()
print(val[0]) # False
start()
请注意,这在不使用多线程时也适用。
推荐阅读
- vue.js - 您如何在自定义组件中使用 buefy 的 b-taginput 使其像 v-model 一样工作,它只能以一种方式绑定?
- mule - 在 Mulesoft 4 中,如何让 http 侦听器接受所有传入消息,而不管路径如何?
- javascript - Firebase 函数 - 发送推送并收到错误消息“TypeError:无法将未定义或 null 转换为对象”
- microsoft-teams - 连接器保存时未调用 settings.getSettings() 回调
- javascript - 如何在 SweetAlert2 弹出窗口队列中使用 then()?
- python - 根据频率替换列中的值
- addeventlistener - 当我将 EventListener 从“click”更改为“keydown”时,代码停止工作
- android - RecyclerView - 连续列布局
- laravel - 如何设置 laravel 以使用一个应用程序并将多个域指向它
- flutter - 带有 Riverpod 的 Flutter 导航栏