在Python中获取MemoryError

时间:2015-03-19 10:06:15

标签: python python-2.7 python-3.x

我在python上运行以下代码来打印nos。在为浮动编号指定的范围内:

def float_range(begin,end,step):  
    i=begin-step
    numbers=[]

    while i!=end:
        i=i+step
        numbers.append(i)
    return numbers      #returning the list

a=2
b=4
c=.1
for j in float_range(a,b,c): #calling function
    print j

它会出现以下错误

Traceback (most recent call last):
  File "C:\Users\b53659\Desktop\My python\float_range.py", line 13, in <module>
    for j in float_range(a,b,c):
  File "C:\Users\b53659\Desktop\My python\float_range.py", line 7, in float_range
    numbers.append(i)
MemoryError.

但在上面的代码中如果我替换

    a=1
    b=1000
    c=1

它给出正确的输出,即打印否。从1到1000。 为什么会这样?提前谢谢

3 个答案:

答案 0 :(得分:2)

问题是您正在使用c=.1,这会使计数器成为浮点数。当循环进入结束时#39; (在float_range)中,我将是4.000000000013.9999999999998,因此它不会与整数4进行比较。

有几种可能的解决方案:

  • 仅使用整数(整数,不是0.1)
  • 使用python的定点数字(decimal.Decimal类)
  • 设置循环结束条件i < end而不是i!=end

答案 1 :(得分:1)

你应该做这样的事情

def float_range(begin,end,step):  
    i = begin-step
    numbers = []

    while i < end:
        i += step
        numbers.append(i)
    return numbers      #returning the list

for j in float_range(2,4,0.1): #calling function
    print round(j, 2)

这样,即使浮点数没有达到确切的整数值,您也可以确保循环在end之上停止。

除了while i < end:之外,我还做了两个其他的更改。您可以使用+=代替i = i+step。我还将花车向下弄圆了,因为如果你不这样做,它会打印3.9000000000000017之类的东西。

我希望这会有所帮助。

答案 2 :(得分:0)

代码中的主要缺陷是while condition !=

您正在检查是否i!=end。这里的步骤是0.1,实际上是0.100000000000001。所以当你达到最后一次迭代时(根据你的逻辑)

i = 3.9 + step = 4.000000001

你有end= 4.0  和i!=end

所以你的while loops condition i!=end is True always和循环会永远继续并抛出内存错误

我已经调试了代码并在列表中找到了实际值。您可以从屏幕截图中看到,4.0值从未生成,而是生成4.0000001 enter image description here

此代码可以按预期工作:

def float_range(begin,end,step):
    i=begin-step
    numbers=[]

    while i < end:
        i=i+step
        numbers.append(i)
    return numbers      #returning the list