我正在使用python错误处理指令。在我的脚本中,我有一些try
块,使用了一些临时变量,它同样适用于except
块。
我想在del
块中使用finally
语句(或类似内容)来清除try
和except
内创建的所有变量。
问题在于,由于我不知道该程序是否可能会失败,因此我并不完全了解创建的先验。
有没有一种优雅的方式来获得它?提前致谢
答案 0 :(得分:2)
正如其他人所指出的那样,您可以使用locals()
来检查变量的存在,但问题仍然是您希望这样做的原因。
我能想象的一个原因是你要确保释放不再需要的大对象的内存。为此,您只需将None
指定给变量即可。
try:
a = VeryLargeObject()
b = AnotherVeryLargeObject()
...
finally:
a = b = None
但是,如果此代码封装在函数中,则只要函数返回,内存就会被释放。
话虽如此,除非遇到实际的内存问题,否则我不会使用手动“内存管理”来混乱我的代码。
在@JonClements评论之后 编辑,我想澄清一下:将None
分配给名称,就像del
一样,实际上并不删除引用的对象名称,它只是删除引用。在此示例中,将不会释放引用的对象a
,因为仍然会从全局列表中引用该对象:
global_list = []
try:
a = VeryLargeObject()
global_list.append(a)
b = AnotherVeryLargeObject()
...
finally:
a = b = None
答案 1 :(得分:1)
您可以复制locals()
dict并比较之前和之后的内容,以了解您需要删除的内容。这可能不赞成,但它应该做你想要的。
a = 3
b = '4'
snapshot = None # make sure snapshot is included in itself
snapshot = locals().copy()
try:
c = 5
assert False
except AssertionError:
d = []
finally:
for variable in list(locals()):
if variable not in snapshot:
del locals()[variable]
del locals()['snapshot'] # optional
assert 'a' in locals()
assert 'b' in locals()
assert 'c' not in locals()
assert 'd' not in locals()
assert 'snapshot' not in locals()