Искам да присвоя една стойност на част от списък. Има ли по-добро решение за това от едно от следните?
Може би най-ефективният, но някак грозен:
>>> 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) (ако приемем, че винаги променям само няколко елемента).
l[2:] = [None]*len(l[2:]
. Просто лошо предложение :) - person Paulo Bu   schedule 09.12.2013