为什么我在此程序的python中收到内存错误?

时间:2019-01-30 15:09:22

标签: python function math arithmetic-expressions

我是python的初学者,正在从事希望进行的入门编程项目:

估算一立方英里的巧克力冰淇淋中的卡路里数量。 注意:一英里有5280英尺,一立方英尺的巧克力冰淇淋含有约48600卡路里。

我的代码:

Onemile = 5280
cubicmile = 5280**3
calories = 48,600
print("Number of calories per cubic mile:",cubicmile*calories)

输出:

Traceback (most recent call last):

  File "<ipython-input-100-90c2410fa01f>", line 4, in <module>
    print("Number of calories per cubic mile:",cubicmile*calories)

MemoryError

为什么会这样?我建立方程式的方式有问题吗?

2 个答案:

答案 0 :(得分:4)

如上所述,问题出在calories = 48,600行。

问题在于,由于右侧的,calories = (48, 600)(即tuple)相同。对于元组,乘法意味着“将元组重复n次”。所以例如2 * (48, 600) == (48, 600, 48, 600)

但是,由于您执行5280**3 * calories,所以此操作试图分配一个包含2 * 5280**3 = 294395904000元素的元组,这似乎太大了,无法容纳到内存中(假设每个值64位,则为2.14 TiB ,这比大多数人的记忆大)。

请注意,在Python 3.6+中,您可以将_用作成千上万个分隔符:

calories = 48_600

答案 1 :(得分:3)

您正在尝试打印元组uint8(这是您写(48, 600)时得到的结果)calories = 48,600次。

您的输出为:

147197952000

您的电脑根本无法处理大约。您要一次转储的Number of calories per cubic mile: (48, 600, 48, 600, 48, 600, ... , 48, 600) 个字符。

您应该只写1324781568000,而不是使用,作为千位分隔符。

48600

输出:

Onemile = 5280
cubicmile = 5280**3
calories = 48600
print("Number of calories per cubic mile:",cubicmile*calories)

编辑:

实际上,并不是打印或创建如此大的字符串失败,因为至少对我来说,似乎在尝试创建指向元组的Number of calories per cubic mile: 7153820467200000 指针时,Python会耗尽内存,您可以只运行147197952000进行测试。