附加列表时的Python MemoryError

时间:2015-08-16 19:44:41

标签: python list function

我有一个小的Python(2.7.10)脚本,你可以在下面看到。

def numbers_calc(max_num, num_step):
    """Returns every number from 0 to max_num with num_step as step."""
    n = 0
    l = []

    while n < max_num + 1:
        l.append(n)
        n += n * num_step

    return l

n_l = []
n_l.append(numbers_calc(25, 1))

print "Here are the numbers."
print n_l

函数numbers_calc用于获取所有给定的args,形成一个列表,并在它到达num_step之前用数字(在计算时使用max_num + 1)填充它。然后,该脚本会return它的名为l的本地列表。

但是,每次运行脚本时,都会遇到MemoryError。这是Python运行脚本时返回的内容:

Traceback (most recent call last):
File "num.py", line 13, in <module>
    n_l.append(numbers_calc(25, 1))
  File "ex33.py", line 7, in numbers_calc
    l.extend(i)
MemoryError

我试着查一下,没有看到任何帮助。我希望你能帮助我!

4 个答案:

答案 0 :(得分:2)

n从0开始。n += n * num_step将0添加到nn永远不会更改,您的循环会不断将项目添加到列表中。

导致n以某种方式改变。

答案 1 :(得分:1)

任何时候0总是0,因此您有一个无限循环设置n = 0最初将n设置为1:

def numbers_calc(max_num, num_step):
   """Returns every number from 0 to max_num with num_step as step."""
   n = 1
   l = []

   while n < max_num + 1:
       l.append(n)
       n += n * num_step
       print(n)
   return l

n_l = []
n_l.append(numbers_calc(25, 1))

输出:

[[1, 2, 4, 8, 16]]

如果你想要一个数字列表,只需使用返回值:

nl = numbers_calc(25, 1)

哪个会给你[1, 2, 4, 8, 16]

如果你真的希望 0到max_num的所有数字,而num_step 使用+=而不是*=,并n留在0

def numbers_calc(max_num, num_step):
       """Returns every number from 0 to max_num with num_step as step."""
       n = 0
       l = []   
       while n < max_num + 1:
           l.append(n)
           n += num_step
           print(n)    
       return l

或只是通过步骤返回范围:

def numbers_calc(max_num, num_step):
       """Returns every number from 0 to max_num with num_step as step."""
       return  list(range(max_num + 1,num_step))

您应该知道,如果该步骤不是max_num的倍数,那么您将无法获得max_num,即numbers_calc(25, 2)将转到24

答案 2 :(得分:1)

问题在于 -

n += n * num_step

在此,您将n初始化为0,然后将nnum_step相乘,其结果始终为0,然后添加它到n。因此n始终位于0。如果您尝试为每个num_step从0循环到max_num + 1,则应使用range()函数,示例 -

def numbers_calc(max_num, num_step):
    """Returns every number from 0 to max_num with num_step as step."""
    l = []

    for i in range(0,max_num + 1,num_step):
        l.append(i)

    return l

答案 3 :(得分:0)

感谢大家的帮助!我甚至没有意识到那里有数学问题。谢谢你们!顺便说一下,这是我脚本的最终版本。

def numbers_calc(max_num, num_step):
    """Returns every number from 0 to max_num with num_step as step."""
    i = 0
    l = []

    while i < max_num + 1:
        l.append(i)
        i += num_step

    return l

n_l = numbers_calc(25, 5)

print "Here are the numbers."
print n_l