Python multiprocessing Array加[:]返回list及同名标识符覆盖问题求解
问题1:
multiprocessing.Array切片返回list的原理 multiprocessing.Array的返回值本质是multiprocessing.sharedctypes.SynchronizedArray类型的包装对象,它是对共享内存中ctypes数组的线程/进程安全封装,本身不属于Python原生的列表类型。
这个类自定义了__getitem__魔法方法来处理下标访问逻辑:当你执行全切片操作[:]时,它的内部实现会把共享内存中存储的所有元素完整拷贝到用户态,组装成Python原生list返回。这是官方预设的设计:既方便开发者快速读取全部值做常规计算,也避免频繁直接操作共享内存触发不必要的进程同步开销。如果是单个元素下标访问比如arr[0],则只会返回对应位置的数值,不会做列表转换。
问题2:同名标识符报错的原理
Python的变量本质是标识符到内存对象的引用绑定,同一个作用域下,后执行的赋值会直接覆盖该标识符之前的绑定关系,和之前绑定的对象类型无关。
- 第一组测试逻辑:你先将
arr绑定到一个list实例,后续又将arr重新绑定到了一个类对象(属于type类型的实例)。原生类对象默认没有实现__getitem__魔法方法,不支持切片/下标操作,因此调用arr[:]时会抛出'type' object is not subscriptable错误,此时arr已经不再是最初的列表对象。 - 第二组测试逻辑:你先将
arr绑定到类对象,后续又将arr重新绑定到了一个list实例。此时arr指向的是列表对象:调用arr()是尝试将列表作为可调用对象执行,但原生list没有实现__call__魔法方法,因此抛出'list' object is not callable错误;调用arr.test是尝试访问列表的test属性,原生list没有定义该属性,因此抛出'list' object has no attribute 'test'错误。
内容的提问来源于stack exchange,提问作者didi
相关产品推荐
相关产品推荐

