Python中字典操作和多处理中的奇怪行为

Python中字典操作和多处理中的奇怪行为,python,dictionary,multiprocessing,Python,Dictionary,Multiprocessing,我正在学习在Python中使用多处理。在做了一些研究之后,我提出了以下代码,它创建了两个对象,池将并行运行作业。原始代码有许多其他代码,因此我简化了以下原型中的代码 import multiprocessing as mp class GrandParent: _data = dict() def __init__(self): pass def run(self, num1, num2): assert (num1 in self._

我正在学习在Python中使用多处理。在做了一些研究之后,我提出了以下代码,它创建了两个对象,池将并行运行作业。原始代码有许多其他代码,因此我简化了以下原型中的代码

import multiprocessing as mp
class GrandParent:
    _data = dict()

    def __init__(self):
        pass

    def run(self, num1, num2):
        assert (num1 in self._data) and (num2 in self._data)
        return self._data[num1] * 232 + self._data[num2] * 101

class Parent(GrandParent):
    def __init__(self):
        GrandParent.__init__(self)

class Child(Parent):
    def __init__(self):
        Parent.__init__(self)
        self._data[0] = 20
        self._data[1] = 100
        self._data[2] = 300

def worker(args):
    obj, method, num1, num2 = args
    return getattr(obj, method)(num1, num2)

if __name__ == '__main__':
    a = Child()
    print(a._data)
    pool = mp.Pool(2)
    objList = [Child(), Child()]
    ML = ((obj, "run", id, 2) for id, obj in enumerate(objList))

    list_results = pool.map(worker, ML)
    pool.close()
    pool.join()
    print(list_results)
代码在池中终止,并由断言(self.\u数据中的num1)和(self.\u数据中的num2)生成一个错误。通过跟踪代码,我发现
\u数据
是空的,尽管在调用之前应该给它分配一些内容(请参见
\uuu init\uuuuu
中的
.Child
)。另外,从中,我认为可以直接使用方括号将键值插入dict,上面代码的输出在调用池之前正确打印所有
\u数据。它会清除
\u data
中的所有键值,因此我尝试更改为使用
update
将键值插入字典

class Child(Parent):
    def __init__(self):
        Parent.__init__(self)
        self._data.update({0: 20})
        self._data.update({1: 100}) 
        self._data.update({2: 300})
这次代码运行时没有错误。这是一种奇怪的行为。有人能解释一下原因吗。谢谢

class GrandParent:
    def __init__(self):
        self._data = dict()
...
解决了这个问题


您的
\u data=dict()
创建了一个名为
\u data
的静态类成员,每次创建对象时都会重复初始化该成员。但是没有使用
\uuuu init\uuuu
在服务器上创建对象,因此那里的数据从未初始化。

python&OS的版本是什么?我的是3.8.3和ubuntu。没有错,啊。。。我想我现在明白了。我对Python非常陌生,我发现变量是在需要时在Python中定义的,这与我在其他语言中所知道的完全不同。我是否仍应将声明变量保留在类的顶部?在python 3.8中,您将在类的顶部编写:
\u data:Dict[int,int]
,其中
Dict
是从包
输入的。在3.9中,您将编写
\u data:dict[int,int]
。注意,这不会给变量赋值;这只是一个没有强制执行的提示。