Pydantic中BaseModel的默认值列表为何不共享?

pydantic basemodel 默认值行为探究:为何列表不共享?

本文深入探讨Pydantic中可变对象(如列表)的默认值行为,解释为何使用BaseModel时,多个实例的列表属性不会共享同一个对象。

问题根源在于以下代码:我们定义一个名为User的Pydantic BaseModel,包含一个名为friends的列表属性,默认值为一个空列表[]。创建两个User实例后,修改其中一个实例的friends属性,另一个实例的friends属性保持不变。

from typing import Listfrom pydantic import BaseModelclass User(BaseModel):    friends: List[int] = []user_1 = User()user_1.friends.append(1)print(user_1.friends)  # 输出:[1]user_2 = User()print(user_2.friends)  # 输出:[]

然而,如果我们不继承BaseModel,则两个实例共享同一个列表:

from typing import Listclass User:    friends: List[int] = []user_1 = User()user_1.friends.append(1)print(user_1.friends)  # 输出:[1]user_2 = User()print(user_2.friends)  # 输出:[1]

区别在于Pydantic的BaseModel如何处理默认值。在不使用BaseModel的情况下,Python类定义机制只创建一次默认列表,所有实例共享该对象。因此,修改user_1.friends会影响user_2.friends

而Pydantic的BaseModel在实例化每个User对象时,都会为friends属性创建一个新的空列表。这是Pydantic为了确保每个实例拥有独立数据副本而设计的。虽然代码中friends的默认值看起来是一个空列表,但Pydantic在内部创建新的列表对象,避免了共享可变对象导致的数据一致性问题。

这与Pydantic的设计目标密切相关:提供数据验证和模型定义,并保持数据独立性。Pydantic的元类(或其内部机制)在创建实例时负责创建新的默认值对象,保证每个实例拥有独立的friends列表。即使Pydantic版本更新,底层实现可能变化,但核心目标——保证实例独立性——保持不变。

Pydantic中BaseModel的默认值列表为何不共享?

以上就是Pydantic中BaseModel的默认值列表为何不共享?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1359431.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 22:43:37
下一篇 2025年12月10日 15:41:39

相关推荐

发表回复

登录后才能评论
关注微信