Python对象参考

时间:2015-02-22 01:27:34

标签: python

我对python中对象值的持续性有点困惑。

假设我有一个类对象a,它附加了一组特定的属性。多个类BC在创建每个类时都有自己对类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

2 个答案:

答案 0 :(得分:1)

除非您创建副本,否则Python不会为您创建副本。您可以使用copy模块创建对象的副本,也可以使用相同的值创建新对象。

在您的示例中,只有一个类A的实例,c_ac_bc_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