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
相关产品推荐
相关产品推荐

