How can i import functions that make use of a variable defined in the current file?
main.py
from functions import a
x = 1
print(a())
functions.py
def a():
return x
Error Message
Traceback (most recent call last):
File "c:\Users\Test\.vscode\extensions\ms-python.python-2019年4月11日987\pythonFiles\ptvsd_launcher.py", line 43, in <module>
main(ptvsdArgs)
File "c:\Users\Test\.vscode\extensions\ms-python.python-2019年4月11日987\pythonFiles\lib\python\ptvsd\__main__.py", line 410, in main
run()
File "c:\Users\Test\.vscode\extensions\ms-python.python-2019年4月11日987\pythonFiles\lib\python\ptvsd\__main__.py", line 291, in run_file
runpy.run_path(target, run_name='__main__')
File "C:\Users\Test\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 263, in run_path
pkg_name=pkg_name, script_name=fname)
File "C:\Users\Test\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "C:\Users\Test\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "c:\Users\Test\Google Drive\Dev\Test\main.py", line 5, in <module>
print(a())
File "c:\Users\Test\Google Drive\Dev\Test\functions.py", line 2, in a
return x
NameError: name 'x' is not defined
2 Answers 2
As another answer has noted, this will not work because of how Python scopes variables.
Instead, therefore, what I suggest is that you move all these variables into a separate file, e.g. constants.py:
main.py
from functions import a
print(a())
constants.py
X = 1
functions.py
from constants import X
def a():
return X
Then, running import main prints 1.
Comments
There are no process-wide globals, only module-level globals. a uses functions.x, not the x in whatever global scope it is called from.
import functions
from functions import a, b, c
functions.x = 1
functions.y = 2
functions.z = 3
print(a())
print(b())
print(c())
Because Python is lexically scoped, each function keeps a reference to the global scope in which it was defined. Name lookups use that scope to resolve free variables.
c, rather than looking upx,yorzafter you complete the imports and start calling the functions? If you really are getting anImportError, then something else is going wrong, unrelated to your global variable design issue.a(x),b(y),c(z)