Python中将类属性存入列表是否存储原始对象引用而非副本?
对的,你最终得到的refs列表里存储的全部是原始对象的引用,没有生成任何对象副本。
原因说明
Python中所有的变量、容器(列表、字典等)默认存储的都是对象的内存引用,而非对象本身,你执行的所有收集操作都没有触发对象拷贝逻辑:
- 初始化
[self.blah]时,只是把self.blah指向的Blah类实例的引用存入列表 - 调用
extend()方法追加字典values()返回的实例时,只是把字典中存储的各个类实例的引用依次添加到列表中,不会创建新的实例
你可以通过下面的代码快速验证:
# 修改refs列表中第一个元素的属性 self.refs[0].custom_attr = "modified" # 打印原始self.blah的对应属性,会发现已经同步变成了modified print(self.blah.custom_attr)
如果你需要存储对象副本,需要显式调用拷贝逻辑:可以使用Python标准库copy模块,浅拷贝用copy.copy(),深拷贝(同时拷贝对象关联的所有子对象)用copy.deepcopy(),只有执行了显式的拷贝操作才会生成独立的对象副本。
内容的提问来源于stack exchange,提问作者sten
相关产品推荐
相关产品推荐

