Переполнение типа данных в цикле for (в python) - PullRequest
0 голосов
/ 26 января 2012

Это мой скрипт на python, который дает мне исключение, подобное этому

IndexError: index out of range: 202252

, если я добавлю 900000 к чему-то меньшему, он прекрасно работает.Функция randint работает с большим количеством больших чисел, и это не то место, где выдается исключение, исключение выдается в for q in range(long(fromline),long(fromline)+500L): этой строке, я думаю, что у меня есть некоторые проблемы с преобразованиями длинных int или какими-то даннымипереполнение типа.

fromline = random.randint(1,900000)
for q in range(long(fromline),long(fromline)+500L):
   if (len(str(lines[fromline+q])) < 3:
      print "blabla"

РЕДАКТИРОВАТЬ

#read the lines from file
f = open("asd.txt")
lines = f.readlines()
f.close()

# print "if I uncoment this, then exception is thrown" +str(len(lines))

, если я это сделаю

печать строк [1] ​​печать строк [100000]...

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

РЕДАКТИРОВАТЬ

Я нахожу, чтоточно моя проблема, пожалуйста, смотрите мой ответ

Ответы [ 5 ]

3 голосов
/ 26 января 2012

В питоне нет целочисленного переполнения. Возможно, ваш список недостаточно велик для доступа по индексу 202252. Проверьте длину lines.

0 голосов
/ 26 января 2012

Я нахожу свою проблему!

хорошо, спасибо всем за помощь, я попробовал это на чистом скрипте Python, и он работает нормально.Но проблема в том, что спинет, который я вам показываю, является лишь частью одного очень большого скрипта, который работает на телефонах.ДА, часть Python является окей, я искал проблему в скрипте Python, но ее там нет.Проблема заключается в ограничениях телефона, а именно, 65536 строк - это ограничение нескольких переменных, которые я использую. Например, если в переменную строк добавлено более 65536 строк, то выдается ошибка IndexError.

Я надеюсь, что это поможет тому, кто использует monkeyrunner с python.

В качестве резюме, когда вы пишете скрипт на python, который запускается на телефоне (например, с monkeyrunner), всегда имейте в виду, что некоторые вещи не будут работать как выожидается, и некоторые скрипты, которые отлично работают на ПК, НЕ будут работать, когда вы запустите их на телефоне

0 голосов
/ 26 января 2012

Почему в мире вы просто не нарезаете этот список и не просматриваете его?

for q in lines[fromline:fromline+501]:
   if len(q) < 3:
      print "blabla"

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

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

0 голосов
/ 26 января 2012

Если у вас 32-битная система, максимальное количество элементов в массиве составляет 536 870 912, а максимальное int равно 2147483647, что, как вы можете видеть, намного больше, чем 202252 в вашем примере.Кроме того, даже если вы хотите сделать следующее:

 >>> int(10000000000000000000)
 10000000000000000000L

Так что, как и другие, нет целочисленного переполнения.И исключение довольно явное, это ошибка индекса, поэтому ваш список недостаточно велик.Чтобы быть в безопасности, и если вы не знаете, насколько большой массив строк, я бы переписал код следующим образом:

max_index = len(lines) - 1
fromline = random.randint(1, max_index/2 - 500)
for q in range(long(fromline),long(fromline)+500L):
   if (len(str(lines[fromline+q])) < 3:
      print "blabla"

------------- После редактирования --------------------

Ваш пример редактирования не имеет смысла в indexerror.Индекс, которого нет, равен 202252, поэтому, конечно, строки [1] и строки [10000] должны работать.Просто сделайте то же самое и напечатайте len (линии) и посмотрите, не меньше ли оно 202252.

0 голосов
/ 26 января 2012

Было бы безопаснее - хотя, возможно, и не так официально - использовать:

for line in lines[long(fromline):long(fromline)+500L]:
   if len(str(line)) < 3:
      print "blabla"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...