2015-02-22 6 views
2

Я немного смущен тем, как значения объектов сохраняются в python.Ссылка на объект 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 

ответ

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 
1

Если вы не создали копию, Python не создаст для вас копию. Вы можете использовать модуль copy для создания копий объектов или создать новый объект с одинаковыми значениями.

В вашем примере есть только один экземпляр класса A, и у каждого из c_a, c_b и c_c есть доступ к нему. Вот почему вы видите 2 в каждом случае, поскольку все они одинаковы для одного и того же объекта.

Смежные вопросы