Инициализация списка объектов в Python

Я ищу, чтобы инициализировать массив / список объектов, которые не пусты-конструктор класса генерирует данные. В C++ и Java я бы сделал что-то вроде этого:

Object lst = new Object[100];

я покопался, но есть ли подходящие для Python способ сделать это?

Это не работает, как я думал (я получаю 100 ссылок на тот же объект):

lst = [Object()]*100

но это, кажется, работает так, как я хочу:

lst = [Object() for i in range(100)]

список понимание кажется (интеллектуально) как "много" работы для чего-то, что так просто на Java.

4 ответов


нет способа неявно вызвать Object() конструктор для каждого элемента массива, как в C++ (напомним, что в Java каждый элемент нового массива инициализируется в null для ссылочных типов).

Я бы сказал, что ваш список способ постижения является наиболее подходящие для Python:

lst = [Object() for i in range(100)]

если вы не хотите наступать на лексическую переменную i, тогда соглашение в Python должно использовать _ для фиктивной переменной, значение которой не материя:

lst = [Object() for _ in range(100)]

для эквивалента аналогичной конструкции в Java вы можете, конечно, использовать *:

lst = [None] * 100

вы должны отметить, что равное значение Python для кода Java (создание массива 100 null ссылки на объект):

Object arr = new Object[100];

или C++ код:

Object **arr = new Object*[100];

- это:

arr = [None]*100

нет:

arr = [Object() for _ in range(100)]

второй будет таким же, как Java:

Object arr = new Object[100];
for (int i = 0; i < arr.lenght; i++) {
    arr[i] = new Object();
}

на самом деле возможности Python для инициализации сложных структур данных намного лучше, чем Java.


Примечание.: С++ код:

Object *arr = new Object[100];

придется сделать столько же работы, сколько понимание списка Python:

  • выделить непрерывную память для 100 объектов

  • вызов объекта:: Object () для каждого из этих объектов

и результатом будет совершенно другая структура данных.


Я думаю, что понимание списка-самый простой способ, но, если вам это не нравится, это, очевидно, не единственный способ получить то, что вы хотите-вызов данного вызываемого 100 раз без аргументов для формирования 100 элементов нового списка. Например, itertools может, очевидно, сделать это:

>>> import itertools as it
>>> lst = list(it.starmap(Object, it.repeat((), 100)))

или, если вы действительно традиционалист, map и apply:

>>> lst = map(apply, 100*[Object], 100*[()])

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

от вашего удивления, что для выполнения этой задачи может потребоваться "столько же, сколько понимание списка", вы, похоже, думаете, что каждый язык должен специально учитывать необходимость выполнения" вызовов типа без аргументов " над другими видами вызовов над вызываемыми объектами, но я не вижу, что настолько важно и важно. особый об этом очень конкретном случае, чтобы гарантировать, что он будет относиться к нему иначе, чем ко всем другим; и, как следствие, я очень рад, что Python не выделяет этот случай для своеобразного и странного лечения, но обрабатывает так же регулярно и легко, как и любой другой аналогичный случай использования!-)


lst = [Object() for i in range(100)]

поскольку массив-это собственный объект первого класса в python, я думаю, что это единственный способ получить то, что вы ищете. * делает что-то сумасшедшее.