2016-08-13 3 views
0

Я создаю простой код. Напримерстранное поведение globals() и locals() в python

x = 50 

def func(x): 
    x = 2 
    print 'Changed local x to', x 

func(x) 

Тогда я типа глобалам() и ожидать, чтобы увидеть список глобальных переменных Вместо этого я получаю странный результат, как это ниже. Зачем? Я использую python 2.7, в jupyter. Все остальное отлично работает. И такое поведение globals() всегда происходит. То же самое с locals().

{'In': ['', 
    u"x = 50\n\ndef func(x):\n print 'x is', x\n x = 2\n print 'Changed local x to', x\n\nfunc(x)\nprint 'x is still', x", 
    u'globals()', 
    u"x = 50\n\n def func(x):\n  x = 2\n  print 'Changed local x to', x\n\n func(x)", 
    u"x = 50\n\ndef func(x):\n x = 2\n print 'Changed local x to', x\n\nfunc(x)", 
    u'globals()'], 
'Out': {2: {...}}, 
'_': {...}, 
'_2': {...}, 
'__': '', 
'___': '', 
'__builtin__': <module '__builtin__' (built-in)>, 
'__builtins__': <module '__builtin__' (built-in)>, 
'__doc__': 'Automatically created module for IPython interactive environment', 
'__name__': '__main__', 
'_dh': [u'C:\\Users\\user'], 
'_i': u" x = 50\n\n def func(x):\n x = 2\n print 'Changed local x to', x\n\n func(x)", 
'_i1': u"x = 50\n\ndef func(x):\n print 'x is', x\n x = 2\n print 'Changed local x to', x\n\nfunc(x)\nprint 'x is still', x", 
'_i2': u'globals()', 
'_i3': u" x = 50\n\n def func(x):\n  x = 2\n  print 'Changed local x to', x\n\n func(x)", 
'_i4': u" x = 50\n\n def func(x):\n x = 2\n print 'Changed local x to', x\n\n func(x)", 
'_i5': u'globals()', 
'_ih': ['', 
    u"x = 50\n\ndef func(x):\n print 'x is', x\n x = 2\n print 'Changed local x to', x\n\nfunc(x)\nprint 'x is still', x", 
    u'globals()', 
    u"x = 50\n\n def func(x):\n  x = 2\n  print 'Changed local x to', x\n\n func(x)", 
    u"x = 50\n\ndef func(x):\n x = 2\n print 'Changed local x to', x\n\nfunc(x)", 
    u'globals()'], 
'_ii': u" x = 50\n\n def func(x):\n  x = 2\n  print 'Changed local x to', x\n\n func(x)", 
'_iii': u'globals()', 
'_oh': {2: {...}}, 
'_sh': <module 'IPython.core.shadowns' from 'C:\Users\user\Anaconda2\lib\site-packages\IPython\core\shadowns.pyc'>, 
'exit': <IPython.core.autocall.ZMQExitAutocall at 0x27d0a90>, 
'func': <function __main__.func>, 
'get_ipython': <bound method ZMQInteractiveShell.get_ipython of <ipykernel.zmqshell.ZMQInteractiveShell object at 0x0272F9D0>>, 
'quit': <IPython.core.autocall.ZMQExitAutocall at 0x27d0a90>, 
'x': 50} 
+1

Это IPython делает это. Вы видите, как они это делают за кулисами :) – zondo

+1

Jupyter/IPython создает все виды странно выглядящих переменных для внутреннего использования и частично для удобства (например, 'exit'). – bereal

ответ

2

То, что вы видите, действительно является глобальными переменными, определенными в вашем сеансе интерпретатора. Их еще несколько, чем вы ожидали! Это потому, что интерактивный интерпретатор использует некоторые переменные в своих целях, например, отслеживание прошлых входов и выходов.

Некоторые из глобалов, которые вы видите (например, __builtins__ и exit), являются документированной частью языка Python. Другие - это детали реализации, специфичные для вашего конкретного интерпретатора или оболочки, и могут быть или не быть документированы нигде.

Что касается locals, это полезно только в функции. На верхнем уровне модуля он вернет точно тот же словарь, что и globals (включая всю интерактивную карту, если вы запускаете ее в интерактивном режиме).

+0

Спасибо, оу. Может быть, есть сжатый формат, который более читабельен любительскому пользователю? – spyimp

+1

'% who' и'% whos' показывают переменные, которые вы создали в этом сеансе. – hpaulj