Глобальная переменная не работает из функции модуля в ipython - PullRequest
0 голосов
/ 01 мая 2018

Я уверен, что кто-то уже ответил на это, но я не могу его найти.

У меня есть сценарий test.py, единственная цель существования которого - поместить переменную var в глобальное пространство имен:

def test():
    global var
    var = 'stuff'

Вот что происходит, когда я запускаю test.py в ipython, используя %run, затем запускаю test() и затем пытаюсь получить доступ к var.

Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: %run test.py

In [2]: test()

In [3]: var
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-3-84ddba356ca3> in <module>()
----> 1 var

NameError: name 'var' is not defined

In [4]:

Есть идеи, что происходит? Или как вообще перенести его в локальное пространство имен?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Команда %run создает отдельное пространство имен для глобальных переменных в файле. Он также обновляет интерактивное пространство имен IPython всеми переменными, определенными в файле после выполнения. Таким образом, вы можете либо вызвать функцию в вашем скрипте, чтобы глобальная переменная была создана до того, как файл завершит выполнение:

def test():
    global var
    var = 'stuff'
test()

или используйте %run -i:

-i запустить файл в пространстве имен IPython вместо пустого. Это полезно, если вы экспериментируете с кодом, написанным в текстовом редакторе который зависит от переменных, определенных в интерактивном режиме.

0 голосов
/ 01 мая 2018

Используйте %run -i test.py, чтобы запустить его в интерактивном пространстве имен и получить доступ к глобальным переменным.

In [1]: %run -i test.py

In [2]: test()

In [3]: var
Out[3]: 'stuff'
...