Изменение членов класса в Python - PullRequest
0 голосов
/ 31 марта 2020

У меня есть небольшой фрагмент кода, где я пытаюсь изменить значения элементов массива объектов класса.

class Test(object):
    def __init__(self):
        self.id = 0

test = []
temp = Test()

for i in range(5):
    temp.id = i
    test.append(temp)
    print(test[len(test)-1].id)

print()

for i in range(5):
    print(test[i].id)

Однако я получаю следующий результат и не могу понять, почему? Любая помощь приветствуется.

0
1
2
3
4

4
4
4
4
4

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Вы переопределяете поле id в своем объекте temp, а затем добавляете его, поэтому ваш список будет содержать один и тот же объект несколько раз.

Вам нужно создать новое Test() объект на каждой итерации:

for i in range(5):
    temp = Test()
    temp.id = i
    test.append(temp)
    print(test[-1].id)

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

Если вы добавите распечатку для списка, вы увидите, что поле id меняется для всех.

0 голосов
/ 31 марта 2020

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

добавьте импорт сверху.

импортная копия

и изменение вашей строки

test.append (temp)

в

test.append (copy.copy (темп))

enter image description here

0 голосов
/ 31 марта 2020

Это нормально. Вы заполняли тест одним и тем же объектом на каждом шаге и модифицировали этот объект. Всякий раз, когда вы делаете модификацию, все ссылки на объект изменяются. Чтобы увидеть это, вы можете распечатать идентификатор temp на каждом шаге

class Test(object):
    def __init__(self):
        self.id = 0

test = []

for i in range(5):
    temp = Test()
    temp.id = i
    test.append(temp)
    print(test[len(test)-1].id)

for i in range(5):
    print(test[i].id)

И вывод будет:

0
1
2
3
4
...