gpt4 book ai didi

python - 深拷贝有问题吗?

转载 作者:太空宇宙 更新时间:2023-11-03 11:35:54 25 4
gpt4 key购买 nike

来源

from copy import deepcopy

class Field(object):
def __init__(self):
self.errors = []

class BaseForm(object):
pass

class MetaForm(type):
def __new__(cls, name, bases, attrs):
attrs['fields'] = dict([(name, deepcopy(attrs.pop(name))) for name, obj in attrs.items() if isinstance(obj, Field)])
return type.__new__(cls, name, bases, attrs)

class Form(BaseForm):
__metaclass__ = MetaForm

class MyForm(Form):
field1 = Field()

f1 = MyForm()
f1.fields['field1'].errors += ['error msg']

f2 = MyForm()
print f2.fields['field1'].errors

输出

['error msg']

问题

为什么会这样输出?我想我在修改之前克隆了错误列表,它们不应该都引用同一个列表?

最佳答案

通过在 元类 中设置 dict fields,您将创建一个类属性。

您定义的 __new__ 方法仅在创建类时运行一次。

更新

您应该像现在一样在 __new__ 中操作 attrs,但将其命名为 _fields。然后创建一个 __init__ 方法,该方法将 deepcopy 执行到名为 fieldsattribute 中。

关于python - 深拷贝有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3215363/

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