Нужно ли пространство для хранения в списке без назначения пространства? [Дубликат]

Если мы рассмотрим общие сценарии, в которых может быть выбрано это исключение, доступ к свойствам с объектом вверху.

Пример:

string postalcode=Customer.Address.PostalCode; 
//if customer or address is null , this will through exeption

здесь, если адрес имеет значение null, то вы получите NullReferenceException.

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

string postalcode=Customer?.Address?.PostalCode;
//if customer or address is null , this will return null, without through a exception
18
задан Mitch Lindgren 9 February 2011 в 18:28
поделиться

1 ответ

Строка

a[:] = [i + 6 for i in a]

не сохранит никакой памяти. Сначала Python оценивает правую сторону, как указано в документации по языку :

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

В данном случае одиночный результат объект будет новым списком, а единственной целью в целевом списке будет a[:].

Мы могли бы заменить понимание списка выражением генератора:

a[:] = (i + 6 for i in a)

Теперь , правая часть вычисляет генератор вместо списка. Бенчмаркинг показывает, что это все еще медленнее, чем наивный

a = [i + 6 for i in a]

. Так действительно ли выражение генератора сохраняет память? На первый взгляд, вы можете подумать, что это так. Но вхождение в исходный код функции list_ass_slice() показывает, что это не так. Строка

v_as_SF = PySequence_Fast(v, "can only assign an iterable");

использует PySequence_Fast () , чтобы сначала преобразовать итерируемый (в данном случае генератор) в кортеж, который затем скопирован в старый список. Кортеж использует тот же объем памяти, что и список, поэтому использование выражения генератора в основном такое же, как использование понимания списка в этом случае. Во время последней копии элементы исходного списка повторно используются.

Мораль, по-видимому, в том, что самый простой подход является лучшим в любом отношении.

41
ответ дан Sven Marnach 24 August 2018 в 02:14
поделиться
Другие вопросы по тегам:

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