for循环中的int数据类型溢出(在python中)
这是我的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
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中