gpt4 book ai didi

python - 带有自定义类的 pickle

转载 作者:IT老高 更新时间:2023-10-28 20:53:46 28 4
gpt4 key购买 nike

假设我在 myClass.py 文件中有一个简单的 python 类定义

class Test:
A = []

我还有两个测试脚本。第一个脚本创建一个 Test 类型的对象,填充数组 A,并将结果 pickle 到一个文件中。它立即将其从文件中解开,并且仍然填充数组。第二个脚本只是从文件中提取出来,数组没有被填充(即 A == [])。这是为什么呢?

test1.py

import myClass
import pickle

x = myClass.Test()

for i in xrange(5):
x.A.append(i)

f = open('data', 'w')
pickle.dump(x,f)
f.close()

f = open('data')
y = pickle.load(f)
f.close

print y.A

和 test2.py

import myClass
import pickle

f = open('data')
y = pickle.load(f)
f.close

print y.A

最佳答案

这是因为您将 Test.A 设置为类属性而不是实例属性。真正发生的事情是,对于 test1.py,从 pickle 文件中读回的对象与 test2.py 相同,但它使用了您最初分配 x.A 的内存中的类。

当您从文件中提取数据时,它会创建一个类类型的新实例,然后应用它需要的任何实例数据。但是您唯一的数据是类属性。它总是引用内存中的类,你在一个文件中修改了它,但不在另一个文件中。

比较本例中的差异:

class Test:
A = [] # a class attribute
def __init__(self):
self.a = [] # an instance attribute

您会注意到实例属性 a 将被正确地 pickle 和取消 pickle ,而类属性 A 将仅引用内存中的类。

for i in range(5):
x.A.append(i)
x.a.append(i)

with open('data', 'wb') as f:
pickle.dump(x,f)

with open('data', 'rb') as f:
y = pickle.load(f)

>>> y.A
[0, 1, 2, 3, 4]
>>> y.a
[0, 1, 2, 3, 4]
>>> Test.A
[0, 1, 2, 3, 4]
>>> Test.A = [] # resetting the class attribute
>>> y.a
[0, 1, 2, 3, 4]
>>> y.A # refers to the class attribute
[]

关于python - 带有自定义类的 pickle ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10842553/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com