首页 > 解决方案 > Python:threading.Thread,值是按值传递还是按引用传递?

问题描述

我将值 i 传递给th = threading.Thread(target=func, args=(i,))并立即启动线程th.start()。因为这是在更改索引 i 的循环内执行的,所以我想知道线程内的 i 是否从线程创建时保留其值,或者线程是否正在处理 i 的引用。在后一种情况下,该值不一定与创建 th 时的值相同。值是通过引用还是值传递?

标签: pythonmultithreadingpass-by-referencepass-by-value

解决方案


我想说,将可变对象传递给函数是通过引用调用。

你不是唯一一个想这么说的人,但是这样想会限制你与他人交流 Python 程序实际工作方式的能力。

考虑以下 Python 片段:

a = [1, 2, 3]
b = a
foobar(a)
if not b is a:
    print('Impossible!')

如果 Python 是一种“按引用传递”的编程语言,那么foobar(a)调用可能会导致该程序Impossible!通过更改局部变量a来引用某个不同的对象来打印。

但是,Python 不做引用传递。它只传递值,这意味着没有定义foobar可以使片段执行print调用。该foobar函数可以改变局部变量所a引用的对象,但它没有修改a自身的能力。

https://en.wikipedia.org/wiki/Evaluation_strategy


推荐阅读