Индекс и списки - индекс вне диапазона - PullRequest
0 голосов
/ 22 марта 2019

Не должен ли печататься следующий код?100 100

price = 100  # assigns 'price' reference to 100
price = [price] # creates a 'price' list with 1 element: [100]

for i in range(1, 3):
    print(price[0]) # prints 100
    price[i] = price[i - 1]
    price.append(price[i])
    print(price[i])

Получение ошибки IndexError: list assignment index out of range в строке price[i] = price[i - 1], но строка перед печатью успешно выдает 100.Не должна ли цена [i] просто получать назначенное значение цены [0]?

Ответы [ 5 ]

2 голосов
/ 22 марта 2019

Вы пытаетесь добавить элементы в список или, точнее, инициализировать список повторяющимися копиями чего-либо.Вот Pythonic способы сделать это:

# Use a list comprehension
>>> price = [100 for _ in range(3)]
[100, 100, 100]

# Use itertools.repeat
>>> import itertools
>>> list(itertools.repeat(100, 3))
[100, 100, 100]

Они оба быстрее (многократно) делают append(), то есть O (N), поэтому многократное выполнение append() есть O (N ^ 2)в длинном списке, который становится очень медленным.

(Кстати, если вы знаете, априори список будет содержать по крайней мере N элементов, а N большое, вы можете инициализировать его как price = [None] * N, и вы получите [None, None, None...]. Теперь вы можете напрямую назначать их. Но явное добавление - лучшая практика для начинающих.)

0 голосов
/ 22 марта 2019

Это не распечатает:

100

100

Вы инициализировали список с 1 элементом, размер этого списка равен 1. Однако ваш диапазон начинается с 1 для цикла for, что на самом деле происходит:

price = 100  # assigns 'price' to 100
price = [price] # creates a 'price' list with 1 element: [100]

for i in range(1, 3): # The list is 0-indexed, meaning price[0] contains 100
    print(price[0]) # prints 100 as it should
    price[i] = price[i - 1] # i is 1, price[i] is not an assigned value, i.e: you never assigned price[1]
    price.append(price[i]) # This doesn't execute because an exception was thrown
    print(price[i]) # Neither does this

Чтобы получить результат, который вы ищете, это будет работать:

price = [100] # creates a 'price' list with 1 element: [100]

for i in range(0, 2): # Start at index 0
    print(price[i]) # Print current index
    price.append(price[i]) # Append current value of price[i] to the price list

Чтобы убедиться, что все добавлено, как вы ожидали, вы можете протестировать его с помощью len:

print(len(price))

Output:3

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

0 голосов
/ 22 марта 2019

Проблема в том, что вы присваиваете индекс, слишком большой для длины массива.

для i в диапазоне (1, 3):

Это инициализирует i в 1. Поскольку массивы индексируются с нуля, а длина вашего массива равна 1 на первом проходе, вы попадете на assignment out of range error в строке, которую вы упомянули (когда i=1).

Вот минимальный пример, показывающий проблему:

my_array = ["foo"]
my_array[1] = "bar" # throws assignment out of range error
0 голосов
/ 22 марта 2019

Вы не можете назначить значение списку напрямую, почему в этом списке указан предыдущий размер.Вы должны использовать append для добавления элементов в нужную вам позицию.

Проверка:

# Check the value on our initial position
print(price[0])
for i in range(1, 3):
    price.append(price[i-1])
    print(price[i])
0 голосов
/ 22 марта 2019

Если вы просто пытаетесь добавить в список, попытка сделать это с помощью индекса не будет работать точно, потому что этот индекс отсутствует в списке:

somelist = []
somelist[0] = 1
IndexError

Так что просто используйте append

for i in range(1,3):
    price.append(price[i-1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...