Почему этот класс Python копирует содержимое другого класса? - PullRequest
4 голосов
/ 21 апреля 2010

Я пытаюсь понять странное поведение в Python.

У меня есть следующий код Python:

class IntContainer:

    listOfInts = []

    def __init__(self, initListOfInts):

        for i in initListOfInts:
            self.listOfInts.append(i)

    def printInts(self):

        print self.listOfInts

if __name__ == "__main__":

    intsGroup1 = [1,2,3,4]
    intsGroup2 = [4,5,6,7]

    intsGroups = [intsGroup1,intsGroup2]

    intsContainers = []

    for ig in intsGroups:
        newIntContainer = IntContainer(ig)
        intsContainers.append(newIntContainer)

    for ic in intsContainers:
        print ic.listOfInts

Я ожидаю получить что-то вроде:

[1, 2, 3, 4]
[4, 5, 6, 7]

Но я получаю:

[1, 2, 3, 4, 4, 5, 6, 7]
[1, 2, 3, 4, 4, 5, 6, 7]

Мне нужно проверить следующий вопрос:

почему Python повторно использует экземпляр класса внутри функции

И много ссылок на Python, но я не могу понять, что происходит.Я думаю, что это связано с повторным использованием идентификатора newIntContainer, но я не понимаю его глубоко.

Почему Python, кажется, повторно использовал последнюю ссылку для нового объекта, даже если я добавил его в постоянный список?Что я могу сделать, чтобы устранить это поведение?

Спасибо;)

Ответы [ 2 ]

6 голосов
/ 21 апреля 2010

Так как вы сделали listOfInts переменную class , это то, к чему self.listOfInts обращается, к какому бы экземпляру self это ни было; Итак, все append s идут в тот же список .

Если это не то, что вам нужно, вам нужно сделать listOfInts переменной instance , например, присвоив self.listOfInts = [] в начале метода __init__.

2 голосов
/ 21 апреля 2010

listOfInts был определен как переменная класса.

Переменные класса являются общими для всех экземпляров класса.

Это поведение полезно, если вы хотите сохранить связанное с классом состояние (типичный пример - когда вы хотите узнать количество экземпляров созданного класса.

Если вы хотите, чтобы listOfInts был уникальным для каждого экземпляра, вы должны определить его в init или другом методе класса как self.listOfInts

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