#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 может быть полезно получить это значение.