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

for循环中的int数据类型溢出(在python中),python,for-loop,overflow,Python,For Loop,Overflow,这是我的python脚本,它给了我这样一个异常 IndexError: index out of range: 202252 如果我把90万放在更小的地方,效果会更好。函数randint适用于大量较大的数字,而这不是引发异常的地方对于范围内的q(long(fromline),long(fromline)+500L)引发异常:这一行,我想我在长int转换或某种数据类型溢出方面存在一些问题 fromline = random.randint(1,900000) for q in range(lon

这是我的python脚本,它给了我这样一个异常

IndexError: index out of range: 202252
如果我把90万放在更小的地方,效果会更好。函数
randint
适用于大量较大的数字,而这不是引发异常的地方对于范围内的q(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"
如果我这样做

打印行[1] 打印行[100000]

它工作得很好,我真的很困惑,我从来没有见过像这样的问题

IndexError: index out of range: 202252
编辑

#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))

我找到了我的问题所在,请查看我的答案

python中没有整数溢出。可能您的列表不够大,无法访问索引202252。检查
行的长度

python中没有整数溢出。可能您的列表不够大,无法访问索引202252。检查
行的长度

使用以下命令会更安全(尽管可能不是官方命令):

for line in lines[long(fromline):long(fromline)+500L]:
   if len(str(line)) < 3:
      print "blabla"
对于行中的行[long(fromline):long(fromline)+500L]:
如果len(str(line))<3:
打印“blabla”

使用以下方法会更安全(尽管可能不是官方的):

for line in lines[long(fromline):long(fromline)+500L]:
   if len(str(line)) < 3:
      print "blabla"
对于行中的行[long(fromline):long(fromline)+500L]:
如果len(str(line))<3:
打印“blabla”

如果使用32位系统,数组中的最大元素数为536870912,最大整数为2147483647,正如您在示例中看到的,它比202252大得多。此外,即使您愿意:

 >>> int(10000000000000000000)
 10000000000000000000L
就像另一个说的,没有整数溢出。这个异常非常明确,它是一个索引器,所以您的列表不够大。为了安全起见,如果您不知道lines数组有多大,我将重写如下代码:

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"
max_index=len(行)-1
fromline=random.randint(1,最大索引/2-500)
对于范围内的q(长(fromline),长(fromline)+500L):
如果(len(str(lines[fromline+q]))小于3:
打印“blabla”
--------------编辑后--------------------


您的编辑示例在索引器中没有任何意义。不存在的索引是202252,因此当然行[1]和行[10000]应该可以工作。只需执行相同的操作并打印len(行)看看它是否小于202252。

如果你有一个32位系统,数组中的最大元素数是536870912,最大整数是2147483647,正如你在例子中看到的,它比202252大得多。此外,即使你想:

 >>> int(10000000000000000000)
 10000000000000000000L
就像另一个所说的,没有整数溢出。异常非常明显,它是一个索引器,所以您的列表不够大。为了安全起见,如果您不知道您的lines数组有多大,我将重写如下代码:

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"
max_index=len(行)-1
fromline=random.randint(1,最大索引/2-500)
对于范围内的q(长(fromline),长(fromline)+500L):
如果(len(str(lines[fromline+q]))小于3:
打印“blabla”
--------------编辑后--------------------


您的编辑示例在索引器中没有任何意义。不存在的索引是202252,因此当然行[1]和行[10000]应该可以工作。只需执行相同的操作并打印len(行),看看它是否小于202252。

为什么您不将该列表切片并在切片上迭代

for q in lines[fromline:fromline+501]:
   if len(q) < 3:
      print "blabla"
对于行中的q[fromline:fromline+501]:
如果len(q)<3:
打印“blabla”
我还进行了一系列不必要的类型转换(假设您的所有行实际上都已经是字符串)。请注意,当它们太大而不能成为整数时,Python会将它们转换为long,因此您很少需要自己将数字转换为long


顺便说一句,您的原始代码中的错误是,您正在选择一个随机行,而该随机行与最后一行的距离在500行以内,当您尝试迭代超过列表的末尾时,您会得到一个
索引器

为什么您不直接切片该列表并在切片上迭代呢

for q in lines[fromline:fromline+501]:
   if len(q) < 3:
      print "blabla"
对于行中的q[fromline:fromline+501]:
如果len(q)<3:
打印“blabla”
我还进行了一系列不必要的类型转换(假设您的所有行实际上都已经是字符串)。请注意,当它们太大而不能成为整数时,Python会将它们转换为long,因此您很少需要自己将数字转换为long

顺便说一句,您的原始代码中的错误是,您正在选择一个随机行,而该随机行与最后一行的距离在500行以内,当您尝试迭代超过列表的末尾时,您会得到一个
索引器

我发现了我的问题

非常感谢大家的帮助,我在纯python脚本中尝试了这一点,效果很好。但问题是,我向大家展示的spinet只是在手机上运行的一个非常大的脚本的一部分。是的,python部分很好,我在python脚本中搜索问题,但它不存在。问题在于ph的局限性第一,65536行是我使用的几个变量的限制。例如,当超过65536行放入lines变量时,就会抛出索引器

我希望这将有助于将monkeyrunner与python结合使用的人

作为总结,当您编写在手机上运行的python脚本(例如monkeyrunner)时,请始终记住,当您在手机上运行时,有些事情将无法按预期工作,有些在pc上运行良好的脚本将无法工作。

我发现了我的问题

非常感谢大家的帮助,我在纯python脚本中尝试了这一点,效果很好。但问题是,我向大家展示的spinet只是在手机上运行的一个非常大的脚本的一部分。是的,python部分很好,我在python脚本中搜索问题,但它不在那里。问题在li中