Я хочу присвоить отдельное значение части списка. Есть ли лучшее решение для этого, чем одно из следующего?
Может быть, самый результативный, но как-то уродливый:
>>> l=[0,1,2,3,4,5]
>>> for i in range(2,len(l)): l[i] = None
>>> l
[0, 1, None, None, None, None]
Краткая (но я не знаю, понимает ли Python, что перегруппировка элементов списка не требуется):
>>> l=[0,1,2,3,4,5]
>>> l[2:] = [None]*(len(l)-2)
>>> l
[0, 1, None, None, None, None]
То же предостережение, как указано выше:
>>> l=[0,1,2,3,4,5]
>>> l[2:] = [None for _ in range(len(l)-2)]
>>> l
[0, 1, None, None, None, None]
Не уверен, что использование библиотеки для такой тривиальной задачи разумно:
>>> import itertools
>>> l=[0,1,2,3,4,5]
>>> l[2:] = itertools.repeat(None,len(l)-2)
>>> l
[0, 1, None, None, None, None]
Проблема, которую я вижу с назначением срезу (по сравнению с циклом for), заключается в том, что Python, возможно, пытается подготовиться к изменению длины "l". В конце концов, изменение списка путем вставки более короткого/более длинного фрагмента включает в себя копирование всех элементов (то есть всех ссылок) списка AFAIK. Если Python делает это и в моем случае (хотя это необязательно), операция становится O (n) вместо O (1) (при условии, что я всегда меняю только несколько элементов).