Python-我不知道如何在这段代码中使用x
varPython-我不知道如何在这段代码中使用x,python,garbage-collection,Python,Garbage Collection,varx是否会转到GC?Python使用引用计数来管理对象,而不是变量。如果您想知道x引用的对象何时从内存中清除,则需要跟踪对它的引用数量x就是这样一个参考 但是,如果没有对同一对象的其他引用(x是对该对象的唯一引用),则会从内存中删除该对象,因为add和mul都不会由test返回 x被这两个嵌套函数用作闭包,因此x引用的对象将获得两个额外的引用(通过函数对象闭包)。但是由于函数对象在函数结束时被删除(因为它们只是test中的局部变量),因此它们的闭包也会被删除,因此最终结果是在test()调用
x
是否会转到GC?Python使用引用计数来管理对象,而不是变量。如果您想知道x
引用的对象何时从内存中清除,则需要跟踪对它的引用数量x
就是这样一个参考
但是,如果没有对同一对象的其他引用(x
是对该对象的唯一引用),则会从内存中删除该对象,因为add
和mul
都不会由test
返回
x
被这两个嵌套函数用作闭包,因此x
引用的对象将获得两个额外的引用(通过函数对象闭包)。但是由于函数对象在函数结束时被删除(因为它们只是test
中的局部变量),因此它们的闭包也会被删除,因此最终结果是在test()
调用结束时不再像调用开始时那样引用x
引用的对象
闭包单元格的特殊性并不重要,因为它们跟踪变量,而不是直接跟踪对象。闭包对于Python来说也是对象(尽管在解释器中有特殊的支持来帮助跟踪原始引用),所以它们也会受到引用计数的影响
您可以使用查看一个对象有多少个引用:
def test(x):
def add(y):
return x+y
def mul(y):
return x*y
return "test"
refcount没有改变,因此函数完成后,test
不会产生额外的引用。如果实际返回了嵌套函数,则会发生更改:
>>> import sys
>>> def test(x):
... def add(y):
... return x+y
... def mul(y):
... return x*y
... return "test"
...
>>> value = 'foo bar'
>>> sys.getrefcount(value)
2
>>> test(value)
'test'
>>> sys.getrefcount(value)
2
def测试2(x):
... def添加(y):
... 返回x+y
... def mul(y):
... 返回x*y
... 返回{'+':add'*':add}
...
>>>测试结果=测试2(值)
>>>测试结果
{'+': , '*': }
>>>sys.getrefcount(值)
3.
>>>del测试结果['+']
>>>sys.getrefcount(值)
3.
>>>del测试结果['*']
>>>sys.getrefcount(值)
2.
这两个函数都引用同一个闭包单元,而闭包单元又引用x
的值,因此,当这两个函数对象仍然存在时,引用计数将增加1。删除这两个函数会清除闭包单元格(该对象的引用计数下降为0),引用计数再次下降
只要'foo bar'
字符串的refcount变为0,它也将被删除。在上面的示例中,它总是2,因为每当我尝试访问引用计数时,namevalue
和sys.getrefcount()
函数都引用它
>>> def test2(x):
... def add(y):
... return x+y
... def mul(y):
... return x*y
... return {'+': add, '*': add}
...
>>> test_result = test2(value)
>>> test_result
{'+': <function add at 0x104e85b90>, '*': <function add at 0x104e85b90>}
>>> sys.getrefcount(value)
3
>>> del test_result['+']
>>> sys.getrefcount(value)
3
>>> del test_result['*']
>>> sys.getrefcount(value)
2