Python中通过__init__传递的是Attribute实例而非类,此理解正确吗?
关于Python实例传递的疑问解答
你的理解完全正确——通过__init__传递的确实是Attribute实例本身,而非类。
Python中所有对象(包括类的实例)都是按引用传递的:当你把Space类里的Attribute实例传给Axis类的__init__方法时,Axis实例的attribute属性只是拿到了同一个实例的引用,相当于两个变量指向内存里的同一个对象。因此,不管通过哪一个引用修改这个对象的属性值,另一个引用访问到的都会是修改后的结果,这就是你看到两边值同时变化的原因。
举个简化的代码示例还原你的场景:
class Attribute: def __init__(self): self.value = 0 class Space: def __init__(self): self.attribute = Attribute() def along(self): return Axis(self.attribute) class Axis: def __init__(self, attr): self.attribute = attr def foo(self): self.attribute.value = 10 # 运行测试 s = Space() a = s.along() a.foo() print(s.attribute.value) # 输出10,与Axis实例的attribute.value同步变化
如果想让两个实例的attribute相互独立,修改其中一个不会影响另一个,你需要在Axis的__init__中创建传入实例的副本。可以使用Python标准库的copy模块实现浅拷贝或深拷贝:
import copy class Axis: def __init__(self, attr): self.attribute = copy.deepcopy(attr) # 深拷贝生成新的Attribute实例
内容的提问来源于stack exchange,提问作者Babababa31
相关产品推荐
相关产品推荐

