for循环中的int数据类型溢出(在python中)

时间:2012-01-26 08:01:00

标签: python for-loop overflow

这是我的python脚本,它给我一个这样的例外

IndexError: index out of range: 202252

如果我把900000放到更小的东西上,那就太棒了。函数randint可以处理很多更大的数字,而不是引发异常的地方,for q in range(long(fromline),long(fromline)+500L):此行抛出异常,我认为我对long 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 个答案:

答案 0 :(得分:3)

python中没有整数溢出。也许你的列表不够大,无法访问索引202252.检查lines的长度。

答案 1 :(得分:0)

使用它会更安全 - 尽管可能不那么正直 -

for line in lines[long(fromline):long(fromline)+500L]:
   if len(str(line)) < 3:
      print "blabla"

答案 2 :(得分:0)

如果你有一个32位系统,数组中的最大元素数是536,870,912,max int是2147483647,你可以看到它比你的例子中的202252大得多。此外,即使您愿意:

 >>> int(10000000000000000000)
 10000000000000000000L

就像对方说的那样没有整数溢出。而且异常非常明确,它是一个indexerror,所以你的列表不够大。为了安全起见,如果你不知道你的行数是多大,我会改写这样的代码:

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.

答案 3 :(得分:0)

为什么在这个世界上你不会只切片那个列表并迭代切片?

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

我也取出了一堆不必要的类型转换(假设你的所有行实际上已经是字符串)。请注意,当Python变得太大而无法成为整数时,Python会将事物转换为long,因此您很少需要自己将数字转换为long。

顺便说一下,原始代码中的错误是你选择一条随机行,并且该随机行在最后一行的500行内,当你尝试迭代超过列表的末尾时,你获得IndexError

答案 4 :(得分:0)

我发现了我的问题!

非常感谢大家的帮助,我在纯python脚本中尝试了这个并且工作正常。但问题是我向你展示的spinet只是在手机上运行的一个非常大的脚本的一部分。是的python部分是okey,我在python脚本中搜索问题,但它不存在。问题在于手机的局限性,因为65536行是我使用的少数变量的限制。例如,当行变量中放入多于65536行时,抛出IndexError。

我希望这会对使用monkeyrunner和python的人有所帮助。

作为总结,当你编写一个在手机上运行的python脚本时(例如使用monkeyrunner)总是要记住,有些东西不会像你期望的那样工作,并且一些在pc上工作正常的脚本在运行它们时将无法工作在电话上