Python对象引用
我对python中对象值的持久性有点困惑 假设我有一个class对象Python对象引用,python,Python,我对python中对象值的持久性有点困惑 假设我有一个class对象a,它附加了一组特定的属性。创建多个类B,C时,它们都有自己对类a的引用。只有classC可以修改classa中的内容。当它被修改时,classB是否将其拾取?通过创建我自己的示例,他们似乎做到了这一点 我的问题是,是否有任何情况下,我应该知道什么时候对的更改不会被拾取?python何时创建类a的副本?更具体地说,如何创建一个不会影响原始a的副本 class A: def __init__(self):
a
,它附加了一组特定的属性。创建多个类B
,C
时,它们都有自己对类a
的引用。只有classC
可以修改classa
中的内容。当它被修改时,classB
是否将其拾取?通过创建我自己的示例,他们似乎做到了这一点
我的问题是,是否有任何情况下,我应该知道什么时候对的更改不会被拾取?python何时创建类a
的副本?更具体地说,如何创建一个不会影响原始a
的副本
class A:
def __init__(self):
self.x = 1
def changeX(self,num):
self.x = num
class B:
def __init__(self,classA):
self.x = classA
class C:
def __init__(self,classA):
self.x = classA
def ChangeA(self,num):
self.x.changeX(num)
c_a = A()
c_b = B(c_a)
c_c = C(c_a)
c_c.ChangeA(2)
# All returns 2
c_a.x
c_b.x.x
c_c.x.x
除非创建副本,否则Python不会为您创建副本。您可以使用
copy
模块创建对象的副本,也可以创建具有相同值的新对象
在您的示例中,类
A
只有一个实例,并且c_A
、c_b
和c_c
中的每一个都可以访问它。这就是为什么在每种情况下都会看到2
,因为它们在同一个对象上都是相同的属性。Python中的赋值语句不复制对象,而是在目标和对象之间创建绑定
提供了一个易于理解的指南,说明此语言与其他语言的区别
当您需要更改指定的对象以使其不影响其他指定的对象时,您可以使用复制
模块。()
import copy
class A:
def __init__(self):
self.x = 1
def changeX(self,num):
self.x = num
class B:
def __init__(self,classA):
self.x = classA
class C:
def __init__(self,classA):
self.x = classA
def ChangeA(self,num):
self.x.changeX(num)
c_a = A()
c_b = B(c_a)
c_c = copy.deepcopy(C(c_a))
c_c.ChangeA(2)
c_a.x #1
c_b.x.x #1
c_c.x.x #2