Python:threading.Thread,值是按值传递还是按引用传递?

标签 python multithreading pass-by-reference pass-by-value

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

最佳答案

I would say, passing mutable objects to functions is calling by reference.

您并不是唯一一个这么想的人,但这种想法限制了您与他人交流 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

关于Python:threading.Thread,值是按值传递还是按引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53081697/

相关文章:

python - 我正在制作一个刽子手项目,但无法弄清楚这段代码是如何工作的

python - Discord Bot 未激活

Python:如何在用分号分隔的 Pandas 数据框的列中查找值?

python - 无法使用 pickle 和多个模块加载文件

c# - 如何从页面上的线程关闭窗口?

c# - 为什么 C# 不允许将 using 变量作为 ref 或 out 传递给函数

python - 来自 sklearn 的 BayesianGaussianMixture 的非常大的对数概率

multithreading - Haskell - 创建线程,写入屏幕, sleep 线程,向屏幕写入其他内容

分配给变量的 JavaScript 函数表达式(通过引用传递还是通过值传递?)

java - Java 是 "pass-by-reference"还是 "pass-by-value"?