我目前正在使用jupyter筆記本,我想刪除僅在單元格內使用的變量,這樣我就不會意外地在其他單元格中濫用這些變量。例如,我想刪除以下代碼中的變量myvar和循環變量:istart = 1stop = 2for i in range(start, stop): passmyvar = "A"# other statements# ...del i, myvar # Runs ok, and variables i and myvar are deleted and I won't accidentally use i or myvar in another jupyter notebook cell這工作得很好,但在某些情況下,某些變量實際上沒有定義。在下面的示例中,這會引發錯誤,因為i未定義,因為循環從未運行。定義的變量myvar不會被刪除。start = 1stop = 1 # Now we have stop equal to 1for i in range(start, stop): passmyvar = "A"# other statements# ...del i, myvar # NameError, since i is not defined, and myvar is not deleted我已經使用contextlib或try- except語句來避免錯誤,但仍然myvar沒有被刪除。import contextlibstart = 1stop = 1for i in range(start, stop): passmyvar = "A"# other statements# ...with contextlib.suppress(NameError): del i, myvar # Error suppressed, but myvar is not deleted唯一的解決方法是為每個要刪除的變量包裝 del 語句。import contextlibstart = 1stop = 1for i in range(start, stop): passmyvar = "A"# other statements# ...with contextlib.suppress(NameError): del iwith contextlib.suppress(NameError): del myvar# ...# It works but codes get messy if I need to delete many variables然而,這會使代碼變得混亂,尤其是當您有很多變量需要刪除時(如果有 n 個變量則需要刪除 n 行)。有沒有辦法用一兩行代碼安全地刪除所有已定義和未定義的變量,并減少混亂的代碼?
3 回答

MMTTMM
TA貢獻1869條經驗 獲得超4個贊
安全地做一件事del x
:
globals().pop('x', None);
有很多方法可以做到這一點,但它們需要超過 1 行代碼,我想這不是您想要的。請注意;
最后,這可以防止 Jupiter 打印該變量。

斯蒂芬大帝
TA貢獻1827條經驗 獲得超8個贊
您可以通過檢查變量是否在globals()or中來檢查變量是否確實存在,而不是抑制錯誤locals()。不過,您必須操作字符串名稱并形成一個del語句來使用 執行它exec。
to_delete = ['i', 'myvar']
for _var in to_delete:
if _var in locals() or _var in globals():
exec(f'del {_var}')
添加回答
舉報
0/150
提交
取消