Проблема в понимании Python выделения памяти для списка объектов - PullRequest
1 голос
/ 14 марта 2020

Я хочу хранить разные значения в разных атрибутах объекта. Но в следующей программе изменение, внесенное в переменную класса одного объекта, влияет и на другие. Кажется, все объекты ссылаются на одну и ту же переменную класса (расположение в памяти)? (это не должно быть), но вывод говорит, что ...

class abc:
    list1=[]
    list2=[1,2,3,4,5,6,7,8,9,10]
    def disp_obj(self):
        print("List1=",self.list1,"List2=",self.list2)
    def change(self):
        self.list1.append(self.list2.pop())
xyz=[]
for i in [1,2,3,4]:
    xyz.append(abc())
for i in [0,1,2,3]:
    xyz[i].change()
    xyz[i].disp_obj()

Вывод:

List1= [10] List2= [1, 2, 3, 4, 5, 6, 7, 8, 9]
List1= [10, 9] List2= [1, 2, 3, 4, 5, 6, 7, 8]
List1= [10, 9, 8] List2= [1, 2, 3, 4, 5, 6, 7]
List1= [10, 9, 8, 7] List2= [1, 2, 3, 4, 5, 6]

Но мой ожидаемый вывод:

List1= [10] List2= [1, 2, 3, 4, 5, 6, 7, 8, 9]
List1= [10] List2= [1, 2, 3, 4, 5, 6, 7, 8, 9]
List1= [10] List2= [1, 2, 3, 4, 5, 6, 7, 8, 9]
List1= [10] List2= [1, 2, 3, 4, 5, 6, 7, 8, 9]

1 Ответ

2 голосов
/ 14 марта 2020

Все ваши abc() экземпляры имеют одинаковые атрибуты list1 и list2, так как они объявлены в объявлении класса.

Вы должны создавать новые в методе __init__.

class abc:
    def __init__(self):
        self.list1=[]
        self.list2=[1,2,3,4,5,6,7,8,9,10]
    def disp_obj(self):
        print("List1=",self.list1,"List2=",self.list2)
    def change(self):
        self.list1.append(self.list2.pop())
...