在方法中返回后覆盖类属性

分享于2022年07月17日 class methods numpy python 问答
【问题标题】:在方法中返回后覆盖类属性(Overwriting a class attribute after returning it in method)
【发布时间】:2022-01-26 12:15:27
【问题描述】:

我有一个类方法,它将 numpy 数组构造为类属性。我希望此属性在返回后设置为 None 。我使用的是属性而不是变量,因为创建数组是以并行方式完成的。这些数组可能非常大,所以我想避免将它放在内存中两次。最好的方法是什么?

import numpy as np

class foo:
    
    def __init__(self):
        self.values = None
    
    def bar(self):
        self.values = np.arange(1e9)  # Large array
        return self.values
        self.values = None  # To be set to None after returning

  • values = self.values self.values = None return values ?您是否认为 values = self.values 复制了数组?因为事实并非如此。
  • 更不用说 self.values = None 在返回后它永远不会被执行。 return 停止函数的执行设置类属性的意义是什么,然后在同一个函数中返回它,然后将其设置回 None 无论如何。如果你想要的只是一个大数组,你可以直接返回 np.arrange(1e9) 而无需将其设置为属性。
  • @Axe319 谢谢!我在这里错过了显而易见的事情。如果您将其发布为答案,我会接受。
  • @RazvanBunga 我知道,我这样说只是为了说明我想做什么

【解决方案1】:

Python 不会在赋值时复制对象,它只会传递对同一对象的引用。

return np.arange(1e9) 将简单地返回对创建数组的引用。创建任何包含它的新变量,例如 var = np.arange(1e9) ,只会将数组的引用分配给变量。

如果有帮助,欢迎您 visualize