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

Использовать мощную систему ресурсов.

В макете xml задайте количество столбцов для целочисленного ресурса, а затем в /values/integers.xml установите для него 2 для портрета и в /values-land/integers.xml установите для него значение 3 для пейзажа

// хорошо, если вы выполняете configChanges в манифесте, вам нужно будет изменить количество столбцов из java в onConfogurationChanged

13
задан Seanny123 27 August 2014 в 20:54
поделиться

4 ответа

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

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

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

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

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

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

lst = [None] * 100
32
ответ дан 1 December 2019 в 17:51
поделиться

Обратите внимание, что Python эквивалентен коду Java (создание массива из 100 нулевых ссылок на объект):

Object arr = new Object[100];

или код C ++:

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

is:

arr = [None]*100

not:

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

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

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

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


Примечание: Код C ++:

Object *arr = new Object[100];

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

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

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

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

12
ответ дан 1 December 2019 в 17:51
поделиться

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

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

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

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

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

Из вашего удивления, что для выполнения этой задачи может потребоваться «столько, сколько понимание списка», Вы, кажется, думаете, что каждый язык должен учитывать особый случай необходимости выполнять «вызовы типа без аргументов» по ​​сравнению с другими видами вызовов вызываемых объектов, но я не понимаю, что такого важного и особенного в этом очень конкретном случае, чтобы требуют, чтобы к нему относились иначе, чем ко всем остальным; и, как следствие, я лично очень счастлив, что Python не выделяет этот случай для странного и странного обращения, а обрабатывает его так же регулярно и легко, как и любой другой подобный вариант использования! -)

2
ответ дан 1 December 2019 в 17:51
поделиться
lst = [Object() for i in range(100)]

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

0
ответ дан 1 December 2019 в 17:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: