Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python对象引用_Python - Fatal编程技术网

Python对象引用

Python对象引用,python,Python,我对python中对象值的持久性有点困惑 假设我有一个class对象a,它附加了一组特定的属性。创建多个类B,C时,它们都有自己对类a的引用。只有classC可以修改classa中的内容。当它被修改时,classB是否将其拾取?通过创建我自己的示例,他们似乎做到了这一点 我的问题是,是否有任何情况下,我应该知道什么时候对的更改不会被拾取?python何时创建类a的副本?更具体地说,如何创建一个不会影响原始a的副本 class A: def __init__(self):

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

假设我有一个class对象
a
,它附加了一组特定的属性。创建多个类
B
C
时,它们都有自己对类
a
的引用。只有class
C
可以修改class
a
中的内容。当它被修改时,class
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

除非创建副本,否则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