Ошибка Python «индекс назначения списка вне диапазона»

#python

#python

Вопрос:

Ubuntu-18.04, Python-2.7.15
Я хочу инициализировать список из 150 нулевых значений в виде стека FIFO, а затем обновлять стек каждую секунду.

 panel_width = 150  
rx_values = [0] * panel_width  
for i in range(0, panel_width):  
    rx_values[i] = 0  

def refresh():  
    global rx_values  
    # update the stack  
    rx_values.remove(0)  
    rx_values[panel_width -1] = rx_bps  
    # more stuff  
    return  

refresh() # every second  
 

выдает:

 Traceback (most recent call last):  
  File "./wxpython/bandwidth/bandwidth.1804.2.py", line 64, in rx_refresh  
    rx_values[panel_width -1] = rx_bps  
IndexError: list assignment index out of range  
 

Что я делаю не так?

Ответ №1:

Вы создаете список из 150 элементов. Это означает, что индексы элементов изменяются от 0 до 149.

Затем вы удаляете первый элемент списка:

 rx_values.remove(0)
 

Следовательно, длина rx_values уменьшается на 1:

 > len(rx_values)
148
 

Но вы пытаетесь получить доступ к элементу с индексом 149:

 rx_values[panel_width -1] = rx_bps  
 

Вам нужно добавить новое значение в конец вашего списка:

 rx_values.append(rx_bps)
 

Комментарии:

1. Спасибо, я все это вижу, но Я ХОЧУ изменить значение с индексом 149. Я собираюсь отобразить rx_values так, чтобы текущие значения находились в правом конце (149), а более старые значения — слева от него, а очень старые значения выпадают с левого конца.

2. Итак, что вы действительно хотите сделать, так это сдвинуть список влево. Я отредактирую свой ответ в соответствии с этим.

Ответ №2:

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

Вместо назначения последнего элемента вы можете просто добавить его.

 panel_width = 150  
rx_values = [0] * panel_width

def refresh():  
    global rx_values  
    # update the stack  
    rx_values.pop(0)  
    rx_values.append(rx_bps)
    # more stuff  
    return  

refresh() # every second
 

Я также использовал pop вместо удаления, поскольку pop возвращает удаляемое значение, для очереди FIFO может быть полезно получить это значение.