等效于Python中R的ls()函数,以删除所有创建的对象

时间:2018-08-23 09:11:19

标签: python python-3.x

我是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()相同的输出的函数?

3 个答案:

答案 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 ,但我已经学会了忍受。