我是Python新手。 R中有一个称为ls()
的函数。我可以使用下面的ls()
和rm()
函数轻松地删除任何创建的对象。
R代码
# Create x and y
x = 1
y = "a"
# remove all created objects
ls()
# [1] "x" "y"
rm(list = ls())
# Try to print x
x
# Error: object 'x' not found
在this中,有人建议在python中使用ls()
的等效词。因此,我尝试在python中执行相同的操作。
Python代码
# Create x and y
x = 1
y = "a"
# remove all created objects
for v in dir(): del globals()[v]
# Try to print x
x
# NameError: name 'x' is not defined
但是问题在于重新创建并打印x
时会抛出错误:
# Recreate x
x = 1
# Try to print x
x
回溯(最近通话最近一次):
文件“”,第1行,在 x
文件 “ C:\ SomePath \ Anaconda \ lib \ site-packages \ IPython \ core \ displayhook.py”, 第258行,在致电中 self.update_user_ns(结果)
文件 “ C:\ SomePath \ Anaconda \ lib \ site-packages \ IPython \ core \ displayhook.py”, 第196行,位于update_user_ns中 如果结果不是self.shell.user_ns ['_ oh']:
KeyError:'_oh'
我注意到dir()
除了我的对象外还提供了一些其他对象。有没有可以提供与R的ls()
相同的输出的函数?
答案 0 :(得分:3)
这里有不同的问题。
此代码正确吗?
# remove all created objects
for v in dir(): del globals()[v]
不,不是!首先dir()
从本地映射返回键。在模块级别,它与globals()
相同,但不在函数内部。接下来,它包含一些您不想删除的对象,例如__builtins__
...
是否有任何函数可以提供与R的ls()相同的输出?
不完全是,但是您可以尝试使用类来模仿它:
class Cleaner:
def __init__(self):
self.reset()
def reset(self):
self.keep = set(globals());
def clean(self):
g = list(globals())
for __i in g:
if __i not in self.keep:
# print("Removing", __i) # uncomment for tracing what happens
del globals()[__i]
创建更清洁的对象时,它会保留所有预先存在的对象的列表(更确切地说是set
对象)。当您调用其clean
方法时,它会从其globals()
映射中删除自创建以来添加的所有对象(包括自身!)
示例(无注释的跟踪):
>>> class Cleaner:
def __init__(self):
self.reset()
def reset(self):
self.keep = set(globals());
def clean(self):
g = list(globals())
for __i in g:
if __i not in self.keep:
print("Removing", __i) # uncomment for tracing what happens
del globals()[__i]
>>> dir()
['Cleaner', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
>>> c = Cleaner()
>>> i = 1 + 2
>>> import sys
>>> dir()
['Cleaner', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'c', 'i', 'sys']
>>> c.clean()
Removing c
Removing i
Removing sys
>>> dir()
['Cleaner', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
答案 1 :(得分:0)
根据我尝试过的@Arihant的评论:
zzz = %who_ls
for v in zzz : del globals()[v]
del v,zzz
我希望可以在一行中完成。欢迎任何建议。
另一个类似的解决方案是:
%reset -f
答案 2 :(得分:0)
来自R,我发现最满意的解决方案是简单地重新启动内核。缺点是您丢失了所有 import ,但我已经学会了忍受。