Python - Назначение глобальной переменной для возврата функции требует, чтобы функция была глобальной? - PullRequest
1 голос
/ 29 июля 2010

Итак, я в замешательстве.У меня есть модуль, содержащий некоторые функции, которые я использую в другом модуле.Импортируется так:

from <module> import *

Внутри моего модуля есть функции, целью которых является установка глобальных переменных в основной программе.

main.py:

from functions import *

bar = 20
print bar
changeBar()
print bar

functions.py:

def changeBarHelper(variable):
    variable = variable * 2
    return variable

def changeBar():
    global bar
    bar = changeBarHelper(bar)

Теперь это упрощение, но это наименьший код, который дает тот же результат:

Traceback (most recent call last):
  File "/path/main.py", line 5, in 
        changeBar()
  File "/path/functions.py", line 7, in changeBar
    bar = changeBarHelper(bar)
NameError: global name 'bar' is not defined

Ответы [ 3 ]

3 голосов
/ 29 июля 2010

Выполнение import * так, как вы это сделали, является односторонним процессом.Вы импортировали кучу имен, почти так же, как вы это сделали бы:

from mymodule import foo, bar, baz, arr, tee, eff, emm

Таким образом, все они просто назначены именам в глобальной области видимости модуля, где выполняется import,Что это не делает, это соединяет глобальные пространства имен этих двух модулей.global означает module-global , а не global-to-all-modules.Таким образом, у каждого модуля может быть своя собственная глобальная переменная fubar, и присвоение ей не назначит каждому модулю.

Если вы хотите получить доступ к имени из другого модуля, вы должны импортировать его.Итак, в этом примере:

def foo(var1, var2):
    global bar
    from mainmodule import fubar
    bar = fubar(var1)

Выполняя импорт внутри самой функции, вы можете избежать циклического импорта.

0 голосов
/ 08 июля 2013

def changeBar ()

должно быть:

def changeBar (bar)

таким образом, когда вы вызываете changeBar (bar) в main.py

functions.py работает с переменной bar из main.py

sooo ...

from functions import *

bar = 20
print bar
bar = changeBar(bar)
print bar

def changeBarHelper(variable):
    variable = variable * 2
    return variable

def changeBar(bar):
    bar = changeBarHelper(bar)
    return bar
0 голосов
/ 04 августа 2010

Ну, я не могу комментировать ни одну из публикаций здесь, и это решение не работает. Я хотел бы уточнить это немного.

Здесь есть два модуля:

main.py:

from functions import *

bar = 20
print bar
changeBar()
print bar

functions.py:

def changeBarHelper(variable):
    variable = variable * 2
    return variable

def changeBar():
    global bar
    bar = changeBarHelper(bar)

Теперь это упрощение, но это наименьший код, который дает тот же результат:

Traceback (most recent call last):
  File "/path/main.py", line 5, in 
    changeBar()
  File "/path/functions.py", line 7, in changeBar
    bar = changeBarHelper(bar)
NameError: global name 'bar' is not defined

Теперь, данное решение не работает для меня, и это проблема, которую я действительно хотел бы решить.

...