gpt4 book ai didi

python - Python 中是否会自动清除临时引用?

转载 作者:太空狗 更新时间:2023-10-30 01:09:54 25 4
gpt4 key购买 nike

这基本上是一个关于临时对象生命周期的问题。如果一个函数返回一个对象,但引用没有分配给一个变量,只用于调用返回对象的方法,临时引用会自动清除吗?

举个具体的例子,假设有这样的方法调用链:

o.method_a().method_b()

o.method_a()返回的临时引用调用method_b()时自动清除完成,就好像这行是这样写的:

tmp = o.method_a()
try:
tmp.method_b()
finally:
tmp = None

我对一般答案感兴趣。一旦引用计数降为 0,CPython 就会结束对象。其他 Python 实现可能不会立即结束对象。

我想知道 Python 语言是否像 C++,它保证临时对象在创建它们的语句结束时被销毁(除了在 Python 中,问题是临时引用是否在语句结束时被清除创建它们的语句)。

在 C++ 中,类似的代码可以通过以下方式实现:

class B {
public:
void method_b();
};

class A {
public:
std::shared_ptr<B> method_a();
};



A o;
o.method_a()->method_b();

C++ 标准声明“临时对象在评估完整表达式的最后一步被销毁......(词汇上)包含它们的创建点。即使该评估以抛出异常结束也是如此。 “在此示例中,这意味着临时 std::shared_ptr<B>通过调用 A::method_a() 创建的对象在完整表达式 o.method_a()->method_b(); 的计算结束时立即销毁.销毁 std::shared_ptr意味着清除对共享对象的引用。

最佳答案

是的,垃圾收集器负责跟踪引用计数。当引用计数降为零时,垃圾收集器将删除该对象。这是一个简单的例子。

>>> class C(object):
... def foo(self):
... return B()
...
>>> class B(object):
... def __del__(self):
... print 'deleting %r' %self
... def bar(self):
... print 'I am method bar of %r' %self
...
>>> c = C()
>>> c.foo().bar()
I am method bar of <__main__.B object at 0xa187d2c>
deleting <__main__.B object at 0xa187d2c>

作为旁注,如果有任何其他对象对临时对象的引用,则它不会被删除。只有当引用计数为零时,对象才会被垃圾回收。

还有关于 del 的注释。 del 只是删除对象的引用计数。它不会删除一个对象。例如,如果 a = b = C()del a 只会删除名称 a 并删除对象 C() 的引用计数, 但并没有真正删除它,因为 b 仍然引用它。

你说得对,引用计数是一种 CPython 实现。就其他实现而言,Python 规范不提供任何关于何时销毁对象的保证。

这就是Python Language Reference不得不说的事情:

Objects are never explicitly destroyed; however, when they become unreachable they may be garbage-collected. An implementation is allowed to postpone garbage collection or omit it altogether — it is a matter of implementation quality how garbage collection is implemented, as long as no objects are collected that are still reachable.

关于python - Python 中是否会自动清除临时引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9046606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com