#python #python_3x
Удаляю элементы путем присвоения срезу пустого списка. Все работает. Но стоит задать шаг среза и выскакивает ошибка. В чем дело? >>> a = [1, 2, 3, 4, 5, 6, 7, 8] >>> a[0:3] = [] >>> a [4, 5, 6, 7, 8] >>> a[0:4:2] = [] ValueError: attempt to assign sequence of size 0 to extended slice of size 2
Ответы
Ответ 1
Можно использовать инструкцию del: >>> a = [-1, 1, 66.25, 333, 333, 1234.5] >>> del a[0] >>> a [1, 66.25, 333, 333, 1234.5] >>> del a[2:4] >>> a [1, 66.25, 1234.5] >>> del a[:] >>> a []Ответ 2
Данная конструкция не работает, потому что вы берёте срез и на его место хотите поместить пустой список, а пайтон ждёт от вас список размерности среза. Об этом вам сообщает ошибка: ValueError: attempt to assign sequence of size 0 to extended slice of size 2 a[0:4:2] = [[], []] # [[], 2, [], 4, 5, 6, 7, 8] a[::2] = [[], [], [], []] # [[], 2, [], 4, [], 6, [], 8]] Почему запись вида a = [] то есть запись без применения шага не выдаёт ошибок? Дело в том, что в данном случае после = мы указываем новую ссылку для массива - []. То есть ссылку на пустой массив. И делая такую запись, мы просто заменяем ссылку у переменной a с текущего непустого массива на пустой. А срез [start:end:step] - это массив ссылок на элементы массива, и для того чтобы заменить ссылки в нём на какие-либо другие, то нам, естественно, нужен массив такой же размерности, как и срез. a[::2] = [None for x in range(len(a[::2]))] # [None, 2, None, 4, None, 6, None, 8]
Комментариев нет:
Отправить комментарий