2016-10-20 4 views
1

В python все это «ссылка». В простой программе, у меня есть класс:Статический список объектов в Python

class Watch(object): 
    def __init__(self, **kwargs): 
     self.variables = kwargs 

    def set_variable(self, k, v): 
     self.variables[k]=v 

    def get_variable(self, k): 
     return self.variables.get(k, None) 

    def print_info(self): 
     for k in self.variables: 
      print k + ": " + str(self.variables[k]) 

Если я:

list = [] 
tmp = Watch() 
tmp.set_variable('name','frank') 
list.append(tmp) 
tmp.set_variable('name','doug') 

затем

list[0].get_variable('name') 

является "Дуг"

Как хранить временные переменные списки или массивы при сохранении массива после добавления?

Редактировать: Похоже на How to clone or copy a list?, хотя мне больше интересно узнать о свойствах хранения объектов в python. Кажется, что объекты рассматриваются как указатели, а не просто передают их содержимое. Может кто-нибудь с этим поговорить? Например, в языке, как C++, я мог бы сказать

list[0]=tmp 

, а затем я мог изменить TMP и список [0] останется.

+3

Что вы ожидали? Вы обновили tmp 'name' до' doug', и вот что возвращается – sisanared

+1

try: list.append (copy.copy (tmp)) –

+0

Пожалуйста, не создавайте переменные, которые перезаписывают встроенные объекты ... Это заставляет меня немного умереть внутри – Aaron

ответ

3

Если я правильно понимаю, вы хотите поместить копию tmp в списке таким образом, что, если вы впоследствии изменить tmp, то копия tmp в списке остается то же самое?

Если да, то вы, вероятно, хотите использовать copy модуль:

list = [] 
tmp = Watch() 
tmp.set_variable('name','frank') 
list.append(copy.deepcopy(tmp)) 
tmp.set_variable('name','doug') 
list[0].get_variable('name') # returns 'frank' 
+0

или назначить напрямую без переменной tmp: 'lst.append (Watch(). Set_variable ('name', 'frank ')) ' – Aaron

+0

@Aaron Я думаю, что это, вероятно, способ, которым он предназначен для использования. –