python内存问题

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

假设我有一个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兆字节?或者python识别文件对象并只提供对原始文件的引用


附带问题:在这个例子中使用全局变量更好吗

您正在传递的只是引用。不浪费内存。

您只传递引用。不浪费内存。

您只读取一次文件,因此其内容只存储在内存中一次。发生的情况是:

  • 文件内容被读入并称为
    文件
  • 将引用传递给
    B
    初始值设定项
  • 将引用传递给
    a
    初始值设定项
  • 存储引用的
  • 初始值设定项返回对其创建的对象的引用

重要的是要认识到Python总是通过引用传递参数和返回值。Python中的变量只是对象的名称,而不是存储位置。

您只读取了一次文件,因此它的内容只存储在内存中一次。发生的情况是:

  • 文件内容被读入并称为
    文件
  • 将引用传递给
    B
    初始值设定项
  • 将引用传递给
    a
    初始值设定项
  • 存储引用的
  • 初始值设定项返回对其创建的对象的引用
重要的是要认识到Python总是通过引用传递参数和返回值。Python中的变量只是对象的名称,而不是存储位置

  • 不,Python使用引用,所以在您的示例中只有一个文件数据对象

  • 应尽可能避免使用全局变量。只有在实在没有其他选择时才使用它们

  • 不,Python使用引用,所以在您的示例中只有一个文件数据对象

  • 应尽可能避免使用全局变量。只有在实在没有其他选择时才使用它们

  • 我是否创建了两个文件,因此浪费了2兆字节而不是1兆字节

    没有。事实上,首先没有创建任何文件

    或者python识别文件对象并只提供对原始文件的引用

    在给定的示例中,仅传递对OS文件句柄周围包装器的引用

    附带问题:在这个例子中使用全局变量更好吗

    绝对不是

    我是否创建了两个文件,因此浪费了2兆字节而不是1兆字节

    没有。事实上,首先没有创建任何文件

    或者python识别文件对象并只提供对原始文件的引用

    在给定的示例中,仅传递对OS文件句柄周围包装器的引用

    附带问题:在这个例子中使用全局变量更好吗


    绝对不是。

    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()
    ,所以重新分配文件应该会产生一些奇怪的行为