0

我现在正在编写的程序制作了一个非常庞大的数据项列表。

现在,我可以使这个列表成为全局的(使其他模块中的其他功能可用)并且可以在所有其他模块中使用。或者,我也可以将它们作为模块中函数的函数参数传递。

请注意,我正在谈论的这个巨大的数组不会在其他模块的函数中被修改,它们只是读取数据并将其用于计算和数据统计等。

那么,两种内存消耗最少的方法呢?

如果通过传递给函数,如果语言在本地复制巨大的列表,即使函数没有修改它..那将是内存消耗的两倍,这不是一件好事。如果发生这种情况,我可以将其设为全局并使用它。我对 python 的内存管理产生了这个疑问,因为当我曾经写过一种玩具语言时,我包含了这个特定的问题.. 即参数数据只有在它被编辑时才会被复制.. 否则,它总是指向原始数据。

4

3 回答 3

6

首先,Python 中不存在“全局”变量(从某种意义上说,它自动可用于所有模块)。

其次,Python 在传递给函数时不会复制对象。Python 变量实际上只是指向对象的名称——当您将变量传递给函数时,所发生的只是函数创建了一个指向原始对象的新名称。您可以读取或修改该对象的内容,而无需制作任何副本。(请注意,如果您将名称重新绑定到不同的对象,则原始引用不会更改。)

于 2012-06-14T09:39:38.387 回答
2

这两种方法将具有相同的内存占用。在 python 中使用全局变量被认为是不好的做法,所以你应该避免它。

现在要使用 python,您需要了解它的对象语义。但一个简单的例子是:

def modify(aList):
    aList[1] = 18

a = [1, 2, 3]
modify(a)
print a # [1, 18, 3]
b = a
b[2] = 12
print a [1, 18, 12]
print a is b # true

在 modify 内部,aList 与 a 引用相同的对象。与 b 相同。每次使用指向它的任何标签修改列表元素时,都会修改对象。函数调用只传递标签,而不传递对象。

a is b允许您测试 a 和 b 标签是否引用该对象。

于 2012-06-14T09:39:25.743 回答
1

Python 变量是引用,因此请传递数组的名称 - 尽管严格来说您应该将其称为列表(这就是 Python 中调用的数组)。但是,我对您的措辞感到不安,这意味着您可以将其设为全局并将其作为参数传递。做一件事或另一件事。如果它是全局的,则将其用作全局,不要混合使用这两种方法(如果我误解了,请见谅)。

对于垃圾收集,一个好的开始是查看gc模块的标准库文档。

Python/C API 标准文档中有一些关于内存管理的内容。搜索“内存管理”。

于 2012-06-14T09:40:30.517 回答