python内存问题
假设我有一个1MB的文本文件。考虑到下面的例子:python内存问题,python,memory,Python,Memory,假设我有一个1MB的文本文件。考虑到下面的例子: class A: def __init__(self, file): self.file = file class B: def __init__(self, file): self.a = A(file) f = open(path, 'r') file = f.read() f.close() x = B(file) 我是否创建了两个文件,因此浪费了2兆字节而不是1兆字节?或者pyt
class A:
def __init__(self, file):
self.file = file
class B:
def __init__(self, file):
self.a = A(file)
f = open(path, 'r')
file = f.read()
f.close()
x = B(file)
我是否创建了两个文件,因此浪费了2兆字节而不是1兆字节?或者python识别文件对象并只提供对原始文件的引用
附带问题:在这个例子中使用全局变量更好吗 您正在传递的只是引用。不浪费内存。您只传递引用。不浪费内存。您只读取一次文件,因此其内容只存储在内存中一次。发生的情况是:
- 文件内容被读入并称为
李>文件
- 将引用传递给
初始值设定项李>B
- 将引用传递给
初始值设定项李>a
- 存储引用的李>
- 初始值设定项返回对其创建的对象的引用
重要的是要认识到Python总是通过引用传递参数和返回值。Python中的变量只是对象的名称,而不是存储位置。您只读取了一次文件,因此它的内容只存储在内存中一次。发生的情况是:
- 文件内容被读入并称为
李>文件
- 将引用传递给
初始值设定项李>B
- 将引用传递给
初始值设定项李>a
- 存储引用的李>
- 初始值设定项返回对其创建的对象的引用
绝对不是。Python通过引用传递参数,因此传递到
B()
的“字符串”实际上是指向实际字符串的指针(内存地址)。如果查看示例脚本执行过程中每个点上的对象,就会发现它们都是相同的
例如,此版本打印传递对象的repr()
(使用object.\uuuu repr\uuuu
,因为str.\uu repr\uuuu
打印数据):
结果如下:
passing <str object at 0x280f960> into B()
<__main__.B object at 0x290acd0> received <str object at 0x280f960>
<__main__.A object at 0x290add0> received <str object at 0x280f960>
传入B()
收到
收到
如您所见,当字符串变量被传递到A()
和B()
的构造函数中时,它是同一个对象:实际上是指向字符串的指针
这几乎不会消耗额外的内存。Python通过引用传递参数,因此传递到
B()
的“字符串”实际上是指向实际字符串的指针(内存地址)。如果查看示例脚本执行过程中每个点上的对象,就会发现它们都是相同的
例如,此版本打印传递对象的repr()
(使用object.\uuuu repr\uuuu
,因为str.\uu repr\uuuu
打印数据):
结果如下:
passing <str object at 0x280f960> into B()
<__main__.B object at 0x290acd0> received <str object at 0x280f960>
<__main__.A object at 0x290add0> received <str object at 0x280f960>
传入B()
收到
收到
如您所见,当字符串变量被传递到A()
和B()
的构造函数中时,它是同一个对象:实际上是指向字符串的指针
这只消耗了很少的额外内存。只是一个提示:您不应该使用文件作为名称,因为它是python中的一个函数 你能行
myfile=open('somepath','r')
及
open
是首选方式
事实上,我相信
open()
使用file()
,因此重新分配文件应该会产生一些奇怪的行为。只是一个提示:您不应该将文件用作名称,因为它是python中的一个函数
你能行
myfile=open('somepath','r')
及
open
是首选方式
事实上,我相信open()
使用file()
,所以重新分配文件应该会产生一些奇怪的行为