Как избежать статических списков в классах python? #!/usr/bin/python3
import random
class Vector:

element = []
N = 0

def __init__(self, N):
for i in range(N):
self.element.append(0)
self.N = N
def __str__(self):
out_str = ""
for i in range(self.N):
out_str = out_str + str(self.element[i]) + " "
return out_str
def generate(self):
random.seed()
for i in range(self.N):
self.element[i] = float(random.randint(1, 100))
first = Vector(3)
first.generate()
print(first)
second = Vector(3)
second.generate()
print(first)
print(second)
На вывод в консоль получаю :
38.0 41.0 82.0
34.0 42.0 34.0
34.0 42.0 34.0
Почему при вызове метода второго объекта меняются значения списка, принадлежащего первому объекту? Как избежать?

21 Авг 2019 в 07:07
211 +1
1
Ответы
1

Проблема здесь в том, что вы объявляете список element как переменную класса, что приводит к тому, что все экземпляры класса будут использовать один и тот же список.

Для того чтобы избежать этого, рекомендуется объявлять элемент как переменную экземпляра, присваивая его внутри метода init. Можно сделать следующим образом:

import random
class Vector:
def __init__(self, N):
self.element = []
self.N = N
for i in range(N):
self.element.append(0)
def __str__(self):
out_str = ""
for i in range(self.N):
out_str = out_str + str(self.element[i]) + " "
return out_str
def generate(self):
random.seed()
for i in range(self.N):
self.element[i] = float(random.randint(1, 100))
first = Vector(3)
first.generate()
print(first)
second = Vector(3)
second.generate()
print(first)
print(second)

Теперь каждый экземпляр класса Vector будет иметь свой собственный список element, и изменения в одном экземпляре не повлияют на другой.

20 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир