copy_reg如何保存reduce/rebuild函数

How does copy_reg save the reduce/rebuild functions

假设我使用copy_reg.pickle注册一个reduce函数,如下所示。

import copy_reg, copy, pickle

some_global_variable = 10

class C(object):
  def __init__(self, a):
    self.a = a
    self.b = some_global_variable

def unpickle_c(a):
  c = C(a)
  c.b = some_global_variable

def pickle_c(c):
  return unpickle_c, (c.a,)

copy_reg.pickle(C, pickle_c)

我有几个问题:

  1. 函数 unpickle_c 是否保存为序列化对象并调用 unpickling?如果这是真的,是否意味着我无法访问函数外部的状态,例如 unpickle_c 函数中的 some_global_variable ?或者全局变量是否也作为序列化函数对象的一部分保存?

  2. 如果上述情况不正确,unpickle_c 是否保存为某种标识符,并且函数只是定位并在 unpickling 时调用?如果这是真的,是否意味着,如果包含 unpickle_c 的模块在 unpickling 时尚未导入,它将被导入?

我刚刚通过自己试验 pickle 模块得到了答案。基本上,项目符号 2 是正确的。通过检查 pickled 字符串,保存了模块名称和重建函数的名称。该模块将在 unpickling 时导入,然后调用该模块的函数。