我真的想不出Python需要del关键字的任何原因(而且大多数语言似乎都没有类似的关键字)。例如,与其删除变量,还不如将None赋值给它。当从字典中删除时,可以添加del方法。
在Python中保留del是有原因的吗,还是它是Python前垃圾收集时代的遗迹?
我真的想不出Python需要del关键字的任何原因(而且大多数语言似乎都没有类似的关键字)。例如,与其删除变量,还不如将None赋值给它。当从字典中删除时,可以添加del方法。
在Python中保留del是有原因的吗,还是它是Python前垃圾收集时代的遗迹?
当前回答
我发现del有用的一个地方是清除for循环中的无关变量:
for x in some_list:
do(x)
del x
现在你可以确定,如果你在for循环之外使用x,它将是没有定义的。
其他回答
我发现在使用Numpy处理大数据时,del对于伪手动内存管理非常有用。例如:
for image_name in large_image_set:
large_image = io.imread(image_name)
height, width, depth = large_image.shape
large_mask = np.all(large_image == <some_condition>)
# Clear memory, make space
del large_image; gc.collect()
large_processed_image = np.zeros((height, width, depth))
large_processed_image[large_mask] = (new_value)
io.imsave("processed_image.png", large_processed_image)
# Clear memory, make space
del large_mask, large_processed_image; gc.collect()
当Python GC无法跟上时,系统会疯狂地切换,这可能会导致脚本停止,而它在宽松的内存阈值下运行得非常流畅,从而在机器工作时留下了足够的空间来使用机器浏览和编码。
还有一个小众用途: 在带有ROOT5或ROOT6的pyroot中,"del"可以用于删除引用不再存在的c++对象的python对象。这允许pyroot的动态查找找到同名的c++对象,并将其绑定到python名称。所以你可以有这样一个场景:
import ROOT as R
input_file = R.TFile('inputs/___my_file_name___.root')
tree = input_file.Get('r')
tree.Draw('hy>>hh(10,0,5)')
R.gPad.Close()
R.hy # shows that hy is still available. It can even be redrawn at this stage.
tree.Draw('hy>>hh(3,0,3)') # overwrites the C++ object in ROOT's namespace
R.hy # shows that R.hy is None, since the C++ object it pointed to is gone
del R.hy
R.hy # now finds the new C++ object
希望ROOT7的更健全的对象管理能够填补这个空缺。
由于我还没有看到交互式控制台的答案,我将展示一个。
当foo=None时,该引用和对象存在,它不指向它。
而del foo也会销毁对象和引用。
如果你这样做如果foo是None并且它被删除了它就会升起NameError作为引用,它的对象所有介于两者之间的东西都会被del删除
删除目标列表会递归地从左到右删除每个目标。
与此同时,foo=None只是一个指向None的引用,因此引用仍然是有效的,对象也是如此。
[…在Python中,变量是对象的引用,任何变量都可以引用任何对象[…]
链接到引用1
链接到引用2
我发现del有用的一个地方是清除for循环中的无关变量:
for x in some_list:
do(x)
del x
现在你可以确定,如果你在for循环之外使用x,它将是没有定义的。
另一个小众案例,但很有用。
from getpass import getpass
pass = getpass()
token = get_auth_token(pass)
del pass
# Assume more code here...
在删除pass变量之后,您不会冒它稍后被错误打印出来的风险,或者以其他方式结束在日志或堆栈跟踪中。