Как избежать статических списков в классах 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

Почему при вызове метода второго объекта меняются значения списка, принадлежащего первому объекту? Как избежать?
  • Вопрос задан
  • 238 просмотров
Решения вопроса 1
@Alexander1705
Когда вы объявляете переменные-члены, так как вы это сделали, они связаны с классом, а не с объектом. По аналогии с С++, вы создали переменные-члены elements и N статическими.

Вам нужно создавать переменные-члены в конструкторе, а не в определении класса:
class Vector:

  def __init__(self, N):
    self.elenent = []
    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))


Или использовать специальную переменную __slots__:
class Vector:

  __slots__ = ['element', 'N']

  def __init__(self, N):
    self.elenent = []
    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))


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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы