Python создает объекты параллельно, когда мы используем понимание списка - PullRequest
1 голос
/ 04 ноября 2019

Я столкнулся с этой проблемой, когда кодировал некоторые простые объектно-ориентированные вещи в Python. Допустим, я создал класс с инкрементным идентификатором (используя статическую переменную) и инициализировал новые объекты этого класса, ожидая, что идентификатор каждого нового экземпляра будет автоматически увеличен на 1.

Это класс, который я определил:

class Object:
   counter = 0

   def __init__(self):
      self.id = Object.counter
      Object.counter += 1

Затем я создал массив фиксированной длины, содержащий k экземпляров типа Object. У меня есть два способа сделать это:

(1)

objects = [Object() for i in range(k)]

или (2)

objects = [Objects()] * k

(1) дает мне желаемый результат, т.е. каждый экземпляр имеет инкрементный идентификатор. Интересно, что (2) создает экземпляры с одинаковым идентификатором = 0. Итак, я думаю, (2) делает то же самое, что и (1), но параллельно?

Кроме того, я в основном делаю ООП в Java,и это, как я реализую добавочный идентификатор. Я не знаю, относится ли это и к Python.

Извините, если мой вопрос излишний. Я действительно не знаю, как назвать такие вещи, которые я делаю (постижение списков, я думаю).

Большое спасибо заранее за ваш ответ!

1 Ответ

2 голосов
/ 04 ноября 2019

1 - правильный способ сделать. Он создает k объектов.

2, вероятно, не то, что вы хотите. Он создает только один объект, а затем список, «указывающий» k раз на один и тот же объект.

Используйте следующую команду для визуализации результата 1 и 2

print(list(id(obj) for obj in objects))

Такая ошибка (какв 2) довольно часто встречается многими людьми, пытающимися впервые в своей жизни реализовать двумерный массив, например для шахматной доски.

board = [[0] * 8] * 8  

, который создает один ряд нулей, на который ссылается 8раз.

, чтобы иметь 8 разных строк, которые вы должны были набрать

board = [([0] * 8) for row in range(8)]

print([id(row) for row in board])

покажет разницу

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