Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-我不知道如何在这段代码中使用x_Python_Garbage Collection - Fatal编程技术网

Python-我不知道如何在这段代码中使用x

Python-我不知道如何在这段代码中使用x,python,garbage-collection,Python,Garbage Collection,varx是否会转到GC?Python使用引用计数来管理对象,而不是变量。如果您想知道x引用的对象何时从内存中清除,则需要跟踪对它的引用数量x就是这样一个参考 但是,如果没有对同一对象的其他引用(x是对该对象的唯一引用),则会从内存中删除该对象,因为add和mul都不会由test返回 x被这两个嵌套函数用作闭包,因此x引用的对象将获得两个额外的引用(通过函数对象闭包)。但是由于函数对象在函数结束时被删除(因为它们只是test中的局部变量),因此它们的闭包也会被删除,因此最终结果是在test()调用

var
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,因为每当我尝试访问引用计数时,name
value
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