我对python中对象值的持续性有点困惑。
假设我有一个类对象a
,它附加了一组特定的属性。多个类B
,C
在创建每个类时都有自己对类a
的引用。只有班级C
可以修改班级a
中的内容。修改后,班级B
会接受吗?从创建我自己的例子开始,他们似乎就这样做了。
我的问题是,有什么情况我应该知道什么时候不能接受更改? 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
答案 0 :(得分:1)
除非您创建副本,否则Python不会为您创建副本。您可以使用copy
模块创建对象的副本,也可以使用相同的值创建新对象。
在您的示例中,只有一个类A
的实例,c_a
,c_b
和c_c
中的每一个都可以访问它。这就是为什么您在每种情况下都会看到2
,因为他们在同一个对象上拥有相同的属性。
答案 1 :(得分:1)
Python中的赋值语句不会复制对象,它们会在目标和对象之间创建绑定。
易于理解的指南,说明与其他语言有何不同here。
当您需要更改已分配的对象以使其不影响其他已分配的对象时,您可以使用copy
模块。 (https://docs.python.org/3.4/library/copy.html)
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