You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中setattr会创建深拷贝吗?类属性赋值场景问询

关于Python中setattr的拷贝问题及代码可读性疑问

我查阅了setattr的官方文档后,仍无法确定它是否会创建深拷贝。当前维护的代码库中有一段写法欠佳的setattr使用代码,类构造函数相关片段如下:

for var in vars:
    # ExtMang is another class
    setattr(self, var, ExtMang(self))
# create an alias
for var in vars :
    if var.endswith("_modified") :
        setattr(self, var[:-9], getattr(self, var))

作为C++开发者,我不太清楚这种写法在Python里的接受度,但觉得它可读性很差。我的核心疑问是:当vars = ["price_modified"]时,self.price是self.price_modified的深拷贝还是引用?


核心结论

当vars = ["price_modified"]时,self.price是self.price_modified的引用,而非深拷贝。

原因解释

  • Python里的变量赋值(包括setattr和getattr的操作)本质都是传递对象的引用。getattr(self, var)会返回self.price_modified指向的ExtMang实例的引用,随后setattr只是把这个引用赋值给self.price。
  • 只有显式调用深拷贝相关方法(比如copy.deepcopy())时,才会创建对象的深拷贝。这段代码没有任何触发深拷贝的逻辑,所以两个属性指向的是同一个ExtMang实例。

关于代码可读性的补充

你觉得这段代码可读性差是合理的:

  • 两次遍历vars完全可以合并成一次,减少冗余循环
  • 直接通过属性赋值(比如self.price = self.price_modified)比用setattr+getattr的写法更直观,尤其是在变量名可提前确定的场景下
  • 注释里的"create an alias"已经说明意图,但代码实现方式不够直白

内容的提问来源于stack exchange,提问作者roulette01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:57:26