【问题标题】:Python MemoryError when appending a list追加列表时出现Python MemoryError
【发布时间】:2015-11-09 10:18:43
【问题描述】:

我有一个小的 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 旨在获取所有给定的参数,形成一个列表,并在到达max_num + 1 之前用数字填充它(以num_step 作为计算步骤)。然后脚本执行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

我尝试查找它,没有发现任何帮助。我希望你能帮助我!

【问题讨论】:

  • 您提供的回溯实际上与您提供的代码不匹配。回溯引用了代码中不存在的l.extend(i) 行。
  • 你的函数听起来很像内置的range 函数——你考虑过直接使用它吗?

标签: python list function


【解决方案1】:

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

导致n 以某种方式改变。

【讨论】:

  • 谢谢。真的帮了我!
【解决方案2】:

任何时候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

【讨论】:

    【解决方案3】:

    问题出在一线-

    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
    

    【讨论】:

    • 很高兴我们能提供帮助。我想建议您接受一个答案(以对您最有帮助的为准)(通过单击对勾),这将对社区有所帮助。
    【解决方案4】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2021-11-24
      • 2020-03-02
      • 2017-11-30
      • 2013-11-01
      • 2017-01-28
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多