Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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 垃圾收集无差异_Python_Collections_Garbage - Fatal编程技术网

Python 垃圾收集无差异

Python 垃圾收集无差异,python,collections,garbage,Python,Collections,Garbage,python中的a=None和dela之间有逻辑上的区别吗 None关键字用于定义空变量或对象。在python中,None关键字是一个对象,它是类NoneType的数据类型 del关键字用于删除对象 如果我使用手动垃圾收集,它们是否彼此相同?否,None仍然是一个对象(类型为NoneType),它占用内存并可以引用,而del从名称空间中删除对象的名称 比如说,在全局范围内创建一个变量a=None。它将存在于globals()中。现在,如果您要使用dela删除它,则对a的引用将不再存在。很容易为您

python中的
a=None
dela
之间有逻辑上的区别吗

None关键字用于定义空变量或对象。在python中,None关键字是一个对象,它是类NoneType的数据类型


del关键字用于删除对象


如果我使用手动垃圾收集,它们是否彼此相同?

否,
None
仍然是一个对象(类型为
NoneType
),它占用内存并可以引用,而
del
从名称空间中删除对象的名称


比如说,在全局范围内创建一个变量
a=None
。它将存在于
globals()
中。现在,如果您要使用
dela
删除它,则对
a
的引用将不再存在。

很容易为您自己显示差异:

a = 5
a = None
print(a == 5)  
# False

del a
print(a == 5)
# Traceback (most recent call last):
#  File "<input>", line 1, in <module>
# NameError: name 'a' is not defined
a=5
a=无
打印(a==5)
#假的
德拉
打印(a==5)
#回溯(最近一次呼叫最后一次):
#文件“”,第1行,在
#NameError:未定义名称“a”

换句话说,
a=None
仍将名称
a
保留在会话中<相反,code>dela会完全删除名称,如果您尝试引用它,您将得到一个
namererror

None
是一个完全可行的值。如果GC出现并为我收集了“del关键字用于删除对象”,我会很生气。绝对不正确。Python没有提供直接管理内存的方法
del
删除名称/引用,而不是对象。“如果我使用手动垃圾收集,这些名称/引用彼此相同吗?”什么?Python使用引用计数作为其内存管理策略,您不能显式取消分配对象,只能删除引用。一旦引用计数达到0,对象将立即被回收。引用周期由循环垃圾回收器处理,您可以使用
gc
模块手动调用该回收器,但这不是一个典型的问题。您所说的“如果我使用手动垃圾回收器”是什么意思?您描述的是引用计数,CPython垃圾收集器不会影响它。PyPy的功能是不可预测的,只需一行即可。“del湮灭一个对象”不,它不会。正确的表达方式是“
del
删除一个名称”。“如果没有对的引用,您可以使用gc.collect手动调用垃圾收集器,这可能会释放该对象。”这是不正确的。同样,
a
是参考。您混淆了引用和对象。“仍然在会话中保留对象
a
a
不是对象,而是名称。del删除的是名称而不是对象。好的@juanpa.arrivillaga-我会将其更改为名称。但是
a
仍然是一个对象。一个我认为在名字被删除后会被清除的名字。原来的帖子没有提到del删除对象,只有名称,所以我认为它是正确的,因为它是一种方式。不,
a
不是一个对象,
a
指的是一个对象,但是当你
dela
你删除的是名称
a
a
引用的对象是否返回给解释器。Python语言只保证只要对象存在引用,它就不会被垃圾收集。CPython实现使用引用计数作为其内存管理策略,当对象的引用计数达到0时,对象将立即被回收。仅通过查看一行
dela
,即使在CPython中,您也无法知道对象是否被回收,如果不使用其名称,您将如何引用名称
a
所引用的对象?对象没有“名称”。它们可以以许多不同的方式被引用<代码>a=对象();我的清单=[];我的清单。附加(a);b=a现在有三种不同的对象引用,一种是通过
a
,一种是通过
b
引用,另一种是作为列表中的项目引用。如果I
dela
除了对象的引用计数减少1之外,对象没有发生任何变化,但是,还有2个其他引用存在,即列表中的引用和
b