2015-03-17 6 views
0

Я кодировал Python, и ошибка заставила меня заметить это.Проблемы программирования Python с классом и списками

Скажем, у меня есть этот код:

class test1(object): 
    def __init__(self): 
     self.hello = ["hello"] 
     self.text_back = test2().stuff(self.hello) 
     print "With list: ",self.hello[0], self.text_back[0] 

class test2(object): 
    def stuff(self,text1): 
     self.asdf = text1 
     self.asdf[0] = "goodbye" 
     return self.asdf 

a = test1() 

#--------------- 

class test3(object): 
    def __init__(self): 
     self.hello = "hello" 
     self.text_back = test4().stuff(self.hello) 
     print "Without list:",self.hello, self.text_back 

class test4(object): 
    def stuff(self,text1): 
     self.asdf = text1 
     self.asdf = "goodbye" 
     return self.asdf 

b = test3() 

Выход есть:

With list: goodbye goodbye 
Without list: hello goodbye 

У меня есть идентичный код между ними, за исключением того, что один список и один не является. Почему у меня разные результаты?

ответ

0

В коде мы не создаем новую переменную для списка, мы просто создаем ссылочную переменную name.

Демо:

>> l1 = ["hello"] 
>>> l1= l1 
>>> l2= l1 
>>> id(l1), id(l2) 
(3071912844L, 3071912844L) 
>>> l1 
['hello'] 
>>> l2 
['hello'] 
>>> l2[0] = "goodbye" 
>>> l2 
['goodbye'] 
>>> l1 
['goodbye'] 
>>> 

Обычно копирование списка:

>>> l1 = [1,2,3] 
>>> l2 = l1[:] 
>>> id(l1), id(l2) 
(3071912556L, 3071912972L) 
>>> l1.append(4) 
>>> l1 
[1, 2, 3, 4] 
>>> l2 
[1, 2, 3] 
>>> 

Вложенные datastructures:

>>> l1 = [1,2, [1,2], [3,4]] 
>>> l2 = l1[:] 
>>> l1.append(4) 
>>> l1 
[1, 2, [1, 2], [3, 4], 4] 
>>> l2 
[1, 2, [1, 2], [3, 4]] 
>>> l1[2].append(3) 
>>> l1 
[1, 2, [1, 2, 3], [3, 4], 4] 
>>> l2 
[1, 2, [1, 2, 3], [3, 4]] 
>>> 

Глубокие копии в Python

>>> import copy 
>>> l1 = [1,2, [1,2], [3,4]] 
>>> l2 = copy.deepcopy(l1) 
>>> l1.append(4) 
>>> l1[2].append(3) 
>>> l1 
[1, 2, [1, 2, 3], [3, 4], 4] 
>>> l2 
[1, 2, [1, 2], [3, 4]] 
>>> 

Link