Почему в python не реализовано индексация пустого списка?
Вот код. Я хочу просто перевернуть массив...
x = [10,1,5,2,4,8,6,7,3,9]
print (x, "\n")
temp = [i for i in range (len(x))]
i = 0
end = len(x) - 1
while (end >= 0):
temp[i] = x[end]
i += 1
end -= 1
k = 0
start = 0
while (k < len(temp)):
x[start] = temp[k]
k += 1
start += 1
del(temp)
print (x)
Чтобы перевернуть массив создаю временную переменную temp, изначально хотел вот так:
temp = []
# И потом заполнить сходу в цикле путем типо:
temp[i] = x[k]
x[j] = temp[p]
Но увы, python не разрешает индексировать пустой массив вообще вне цикла внутри цикла... Приходится заполнять временный массив с размером того массива которого хочу перевернуть... Почему так нельзя ? Не пойму что плохого в этом чтобы не добавили такую возможность... Или я не знаю как это сделать... Как можно это решить если можно решить... ?
Версия Python3.11.6
Ответы (2 шт):
Это не "не разрешает индексировать пустой список" (именно так это называется в питоне), а "не позволяет обратиться к несуществующему элементу списка". И это логично и понятно. Если разрешить такое, то получится, что можно обратиться к, например, десятому элементу в списке из пяти элементов. Что вы хотели бы получить в этом случае?
Можете решить свою задачу без инициализации временного списка используя функцию .append(x). Она присоединяет x к концу списка.
Разреженные массивы в питоновских библиотеках есть, но в довольно продвинутых. В "научной" библиотеке SciPy есть раздел scipy.sparse, там разреженные матрицы живут. Нужно это обычно для совсем уж больших данных, когда экономия памяти при использовании разреженных данных будет критичной для работы программы (если без использования разреженных коллекций памяти для работы программы просто не хватит и она просто упадёт). Хотя разреженные матрицы всё-равно требуют при инициализации указать максимальный возможный размер матрицы. Просто при этом не происходит инициализации матрицы значениями и место на хранение не существующих элементов не тратится.
Для небольших же данных не сложно будет использовать питоновские быстрые инициализации для создания списка нужного размера, например:
# заполняем нулями
temp = [0] * len(x)
# заполняем последовательно цифрами 0, 1, 2...
# это более короткий аналог вашего кода
temp = list(range(len(x)))
# делаем копию x
temp = x.copy()
# или так
temp = x[:]