Инициализация списка объектов в 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, я думаю, что это единственный способ получить то, что вы ищете. * делает что-то сумасшедшее.