Список в классе Python разделяет один и тот же объект на 2 разных экземпляра? - PullRequest
7 голосов
/ 03 мая 2010

Я создал класс:

class A:
    aList = []

Теперь у меня есть функция, которая создает экземпляр этого класса и добавляет элементы в aList.

примечание: есть 2 пункта

for item in items:
    a = A();
    a.aList.append(item);

Я считаю, что первый объект A и второй объект A имеют одинаковое количество элементов в своем списке aList. Я ожидаю, что первый объект A будет иметь первый элемент в своем списке, а второй объект A будет иметь второй элемент в своем списке.

Может кто-нибудь объяснить, как это происходит?

PS:

Мне удается решить эту проблему, перемещая aList внутри конструктора:

def __init__(self):
    self.aList = [];

но мне все еще интересно это поведение

Ответы [ 4 ]

11 голосов
/ 03 мая 2010

Вы определили список как атрибут класса.

Атрибуты класса являются общими для всех экземпляров вашего класса. Когда вы определяете список в __init__ как self.aList, тогда список является атрибутом вашего экземпляра (себя), и тогда все работает, как вы ожидали.

4 голосов
/ 03 мая 2010

Вы путаете переменные класса и объекта.

Если вы хотите объекты:

class A(object):
    def __init__(self):
        self.aList = []

в вашем примере aList является переменной класса, вы можете сравнить ее с использованием ключевого слова static в других языках. Переменная класса, конечно, является общей для всех экземпляров.

1 голос
/ 22 сентября 2011

Это произошло потому, что список является изменяемым объектом, и он создается один раз только при определении класса, поэтому он становится общим, когда вы создаете два экземпляра. Например,

class A:
    a = 0 #immutable
    b = [0] #mutable

a = A()
a.a = 1
a.b[0] = 1

b = A()
print b.a #print 0
print b.b[0] #print 1, affected by object "a"

Поэтому, чтобы решить проблему, мы можем использовать конструктор, подобный тому, что вы упомянули. Когда мы помещаем список в конструктор, каждый раз, когда создается экземпляр объекта, также создается новый список.

0 голосов
/ 03 мая 2010

В Python переменные, объявленные внутри определения класса , а не внутри метода, являются class или static переменными. Возможно, вам будет интересно взглянуть на этот ответ на другой вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...