首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >_oh在iPython局部变量()中是什么?以及如何让本地用户返回或在标准python空闲中创建新的

_oh在iPython局部变量()中是什么?以及如何让本地用户返回或在标准python空闲中创建新的
EN

Stack Overflow用户
提问于 2021-01-18 12:24:12
回答 1查看 2K关注 0票数 1

我在IPython (Spyder)中玩弄名称空间,并试图看看如果我使用dict.clear() locals()会发生什么。因此,没有进一步的担心:

代码语言:javascript
复制
Python 3.8.5 (default, Aug  5 2020, 09:44:06) [MSC v.1916 64 bit (AMD64)]
Type "copyright", "credits" or "license" for more information.

IPython 7.19.0 -- An enhanced Interactive Python.

In [1]: locals().clear()

In [2]: locals
Traceback (most recent call last):

  File "<ipython-input-2-f1c14746c80d>", line 1, in <module>
    locals

  File "C:\Users\sayan\Anaconda3\envs\tfgpu_py38\lib\site-packages\IPython\core\displayhook.py", line 263, in __call__
    self.update_user_ns(result)

  File "C:\Users\sayan\Anaconda3\envs\tfgpu_py38\lib\site-packages\IPython\core\displayhook.py", line 201, in update_user_ns
    if self.cache_size and result is not self.shell.user_ns['_oh']:

KeyError: '_oh'


In [3]: dict
Traceback (most recent call last):

  File "<ipython-input-3-0d8c7dca5f1a>", line 1, in <module>
    dict

  File "C:\Users\sayan\Anaconda3\envs\tfgpu_py38\lib\site-packages\IPython\core\displayhook.py", line 263, in __call__
    self.update_user_ns(result)

  File "C:\Users\sayan\Anaconda3\envs\tfgpu_py38\lib\site-packages\IPython\core\displayhook.py", line 201, in update_user_ns
    if self.cache_size and result is not self.shell.user_ns['_oh']:

KeyError: '_oh'




In [4]: globals
Traceback (most recent call last):

  File "<ipython-input-6-0d1754e6861d>", line 1, in <module>
    globals

  File "C:\Users\sayan\Anaconda3\envs\tfgpu_py38\lib\site-packages\IPython\core\displayhook.py", line 263, in __call__
    self.update_user_ns(result)

  File "C:\Users\sayan\Anaconda3\envs\tfgpu_py38\lib\site-packages\IPython\core\displayhook.py", line 201, in update_user_ns
    if self.cache_size and result is not self.shell.user_ns['_oh']:

KeyError: '_oh'

由于内置有单独的命名空间,所以尝试删除local

代码语言:javascript
复制
In [5]: del locals
Traceback (most recent call last):

  File "<ipython-input-5-61828b7e8872>", line 1, in <module>
    del locals

NameError: name 'locals' is not defined

预期,因为名称空间本身被删除了。

我尝试导入builtins并分配给__builtins__

代码语言:javascript
复制
In [6]: import builtins
In [7]: __builtins__ = builtins
In [8]: __builtins__.dict
Traceback (most recent call last):

  File "<ipython-input-11-8211c7f1d719>", line 1, in <module>
    __builtins__.dict

  File "C:\Users\sayan\Anaconda3\envs\tfgpu_py38\lib\site-packages\IPython\core\displayhook.py", line 263, in __call__
    self.update_user_ns(result)

  File "C:\Users\sayan\Anaconda3\envs\tfgpu_py38\lib\site-packages\IPython\core\displayhook.py", line 201, in update_user_ns
    if self.cache_size and result is not self.shell.user_ns['_oh']:

KeyError: '_oh'

此时,我注意到所有的错误都归因于_oh。因此,我重新启动内核,并检查了局部变量:

代码语言:javascript
复制
locals()
Out[1]: 
{'__name__': '__main__',
 '__doc__': 'Automatically created module for IPython interactive environment',
 '__package__': None,
 '__loader__': None,
 '__spec__': None,
 '__builtin__': <module 'builtins' (built-in)>,
 '__builtins__': <module 'builtins' (built-in)>,
 '_ih': ['', 'locals()'],
 '_oh': {},
 '_dh': ['D:\\Programs\\Python\\StackOv'],
 'In': ['', 'locals()'],
 'Out': {},
 'get_ipython': <bound method InteractiveShell.get_ipython of <ipykernel.zmqshell.ZMQInteractiveShell object at 0x000002C2953F37F0>>,
 'exit': <IPython.core.autocall.ZMQExitAutocall at 0x2c295420af0>,
 'quit': <IPython.core.autocall.ZMQExitAutocall at 0x2c295420af0>,
 '_': '',
 '__': '',
 '___': '',
 '_i': '',
 '_ii': '',
 '_iii': '',
 '_i1': 'locals()'}

因此,_oh似乎是一个空字典。现在:

代码语言:javascript
复制
In [2]: locals().clear()

In [3]: dict
Traceback (most recent call last):

  File "<ipython-input-3-0d8c7dca5f1a>", line 1, in <module>
    dict

  File "C:\Users\sayan\Anaconda3\envs\tfgpu_py38\lib\site-packages\IPython\core\displayhook.py", line 263, in __call__
    self.update_user_ns(result)

  File "C:\Users\sayan\Anaconda3\envs\tfgpu_py38\lib\site-packages\IPython\core\displayhook.py", line 201, in update_user_ns
    if self.cache_size and result is not self.shell.user_ns['_oh']:

KeyError: '_oh'


In [4]: locals()['_oh'] = {}

In [5]: dict
Out[5]: dict

因此,我找到了如何拿回locals,但不明白为什么要分配一个空的dict作为_oh带回locals

但是在python中,同样的事情不起作用:

代码语言:javascript
复制
Python 3.7.7 (default, May  7 2020, 21:25:33)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> locals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>}
>>> locals().clear()
>>> locals()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'locals' is not defined
>>> dict
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'dict' is not defined
>>> import builtins
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: __import__ not found
>>> __builtin__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__builtin__' is not defined
>>>

没有_oh,甚至__import__也不能工作。

  • Question 1:如果赋值(__builtins__ = builtins)有效,为什么我不能访问builtins?
  • Question 2:在iPython中是什么以及它如何帮助本地人员返回,作为一个空的dict itself.
  • Question 3:如何在locals().clear() (不重新启动空闲)H 237F 238之后让locals()在python中工作

如果问题3在这个答案的范围内太广,我可以单独提出一个问题。谢谢。

注意:我在 10上尝试了IPython,在linux上尝试了标准IPython提示符(Ubuntu)。不要以为这会有什么区别,而是为了完整性而添加的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-18 16:57:14

在运行的ipython会话中:

代码语言:javascript
复制
In [109]: id(Out)
Out[109]: 139634741914432
In [110]: id(_oh)
Out[110]: 139634741914432

_ohOut字典的另一个名称,我们可以将其用作:

代码语言:javascript
复制
In [112]: Out[109]
Out[112]: 139634741914432
In [113]: _oh[109]
Out[113]: 139634741914432
In [114]: _109
Out[114]: 139634741914432

所以他们为什么用别的名字,我不知道。无论如何,locals().clear()删除了在Out[1]中看到的整个变量字典,并有效地禁用了ipython交互会话。

我不知道使用locals.clear()有什么价值。在一个功能中它可能“更安全”。

神奇的%who显示了交互式变量,这些变量是您自己的代码创建的。也许有一种有选择地删除这些的方法,但我并不需要它。如果我需要一个干净的ipython会话,我只需在一个新的shell选项卡或窗口中启动一个会话。

我已经很长时间没有使用空闲了(甚至没有安装它),所以我无法控制它的locals()。它有一个简单得多的历史机制。

看看魔术,有一个%reset可以用来删除用户定义的变量,甚至清除In/Out历史记录。读它的文档。

另见%who_ls%reset_selective

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65774484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档