Ошибка Python - PullRequest
       27

Ошибка Python

2 голосов
/ 09 июня 2009
a=[]
a.append(3)
a.append(7)

for j in range(2,23480):
    a[j]=a[j-2]+(j+2)*(j+3)/2

Когда я пишу этот код, он выдает ошибку вроде этого:

Traceback (most recent call last):
  File "C:/Python26/tcount2.py", line 6, in <module>
    a[j]=a[j-2]+(j+2)*(j+3)/2
IndexError: list assignment index out of range

Могу ли я знать, почему и как его отладить?

Ответы [ 7 ]

7 голосов
/ 09 июня 2009

Изменить эту строку кода:

a[j]=a[j-2]+(j+2)*(j+3)/2

к этому:

a.append(a[j-2] + (j+2)*(j+3)/2)
6 голосов
/ 09 июня 2009

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

for j in range(2, 23480):
    a.append(a[j - 2] + (j + 2) * (j + 3) / 2)
3 голосов
/ 09 июня 2009

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

Например, предположим, что вы создаете список из 10 человек и пытаетесь указать, кто будет 11-м человеком в этом списке. На вашей бумажной подкладке может быть просто освободить место для другого человека, но объекты времени выполнения, такие как список в python, не так уж просты.

Ваш список начинается пустым из-за этого:

a = []

затем вы добавляете к нему 2 элемента с этим кодом:

a.append(3)
a.append(7)

это делает размер списка достаточно большим, чтобы вместить 2 элемента, два из которых вы добавили, с индексами 0 и 1 (списки python основаны на 0).

В своем коде далее внизу вы указываете содержимое элемента j, который начинается с 2, и ваш код немедленно взрывается, потому что вы пытаетесь сказать "для списка из 2 элементов, пожалуйста, сохраните следующее значение как 3-й элемент ".

Опять же, списки, подобные списку в Python, обычно не так уж просты.

Вместо этого вам придется сделать одну из двух вещей:

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

В вашем случае вы хотите сделать nbr. 2, что означает, что вы хотите переписать эту строку кода:

a[j]=a[j-2]+(j+2)*(j+3)/2

на это:

a.append(a[j-2]+(j+2)*(j+3)/2)

Это добавит новый элемент в конец списка, который в порядке, вместо попытки присвоить новое значение элементу N + 1, где N - текущая длина списка, что не в порядке.

1 голос
/ 09 июня 2009

Если вы хотите отладить его, просто измените свой код, чтобы распечатать текущий индекс по ходу:

 a=[]
 a.append(3)
 a.append(7)

 for j in range(2,23480):
      print j # <-- this line
      a[j]=a[j-2]+(j+2)*(j+3)/2

Но вы, вероятно, обнаружите, что он выдает ошибку в секунду, когда вы получаете доступ a[2] или выше; Вы только добавили два значения, но пытаетесь получить доступ к третьему и последующему.

Попробуйте заменить свой список ([]) словарем ({}); таким образом, вы можете присвоить любые номера, которые вам нравятся, или, если вам действительно нужен список, инициализировать его 23479 элементами ([0] * 23479).

1 голос
/ 09 июня 2009

На j=2 вы пытаетесь присвоить [2], который еще не существует. Вы, вероятно, хотите вместо этого использовать append.

0 голосов
/ 09 июня 2009

Python не динамически увеличивает размер массива при назначении элементу. Вы должны использовать a.append (элемент), чтобы добавить элемент в конец, или a.insert (i, элемент), чтобы вставить элемент в позицию перед i.

0 голосов
/ 09 июня 2009

Списки Python должны быть предварительно инициализированы. Вам нужно сделать a = [0] * 23480

Или вы можете добавить, если добавляете по одному. Я думаю, что было бы быстрее предварительно выделить массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...