Как избежать статических списков в классах 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 Почему при вызове метода второго объекта меняются значения списка, принадлежащего первому объекту? Как избежать?
Проблема здесь в том, что вы объявляете список 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, и изменения в одном экземпляре не повлияют на другой.
Проблема здесь в том, что вы объявляете список element как переменную класса, что приводит к тому, что все экземпляры класса будут использовать один и тот же список.
Для того чтобы избежать этого, рекомендуется объявлять элемент как переменную экземпляра, присваивая его внутри метода init. Можно сделать следующим образом:
import randomclass 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, и изменения в одном экземпляре не повлияют на другой.