使用python的starmap时,为什么用闭包传入的变量位置和用partial传入的不一样?

When using python's starmap, why is the location of a variable passed in using a closure different from that passed in using partial?

当我运行下面的代码时,我看到函数内的变量 z 和 w 有不同的位置,但我不明白为什么会这样。

import multiprocessing
from functools import partial

class SomeClass:
    pass

w = SomeClass()
print("w outside function")
print(w)

def some_function(x, y, z):
    print("w inside function")
    print(w)

    print("z")
    print(z)

    return x * 2


    pool = multiprocessing.Pool(processes=4)
    some_function_partial = partial(some_function, z=w)
    summary = pool.starmap(some_function_partial, [(3, 2)])
    pool.close()
    pool.join()

输出:

w outside function
<__main__.SomeClass object at 0x104916080>
w inside function
<__main__.SomeClass object at 0x104916080>
z
<__main__.SomeClass object at 0x104ef66d8>

如果部分函数在主线程上 运行 所有三个打印语句都表明正在打印的变量引用同一个实例。

如果是 运行 with starmap 函数内 z 的位置与函数外 w 的位置不同。这是我所期望的,因为函数被发送到一个不同的过程是 运行 并且大概是 serialised/deserialised。 但是,当我 运行 使用 starmap 时,w 在函数内部和外部的位置是相同的,我觉得我缺少一些关于为什么的基本理解......任何帮助将不胜感激!

以防万一有人偶然发现:我相信原因是因为当在此系统上创建新进程时,现有堆被复制,这就是为什么 w 在有效范围内有效。 如果这有误,请随时纠正我!