我对全局变量是如何工作的有点困惑。我有一个大项目,大约有50个文件,我需要为所有这些文件定义全局变量。
我所做的是在我的项目main.py
文件中定义它们,如下所示:
# ../myproject/main.py
# Define global myList
global myList
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
我试图在subfile.py
中使用myList
,如下所示
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
globals()["myList"].append("hey")
我试过另一种方法,但也没用
# ../myproject/main.py
# Import globfile
import globfile
# Save myList into globfile
globfile.myList = []
# Import subfile
import subfile
# Do something
subfile.stuff()
print(globfile.myList[0])
和子文件内部。py
我有这样一个:
# ../myproject/subfile.py
# Import globfile
import globfile
# Save "hey" into myList
def stuff():
globfile.myList.append("hey")
但同样,它没有奏效。我应该如何实现这一点?我明白它不能这样工作,当两个文件不真正了解对方(以及子文件不知道主),但我想不出如何做到这一点,不使用iOS写作或泡菜,我不想这样做。
问题是您从main中定义了
,但是myList
。py子文件。py
需要使用它。这里有一个干净的方法来解决这个问题:将所有全局变量移动到一个文件中,我称这个文件为settings。py
。此文件负责定义全局变量并初始化它们:
# settings.py
def init():
global myList
myList = []
接下来,您的子文件可以导入全局文件:
# subfile.py
import settings
def stuff():
settings.myList.append('hey')
请注意,子文件
不调用init()
-该任务属于main。py
:
# main.py
import settings
import subfile
settings.init() # Call only once
subfile.stuff() # Do stuff with global var
print settings.myList[0] # Check the result
这样,您可以在实现目标的同时避免多次初始化全局变量。
请参阅Python关于跨模块共享全局变量的文档:
在单个程序中跨模块共享信息的规范方法是创建一个特殊的模块(通常称为配置或cfg)。
配置。py:
x = 0 # Default value of the 'x' configuration setting
在应用程序的所有模块中导入配置模块;然后,该模块将成为可用的全局名称。
main.py:
import config
print (config.x)
通常,不要使用from modulename import*。这样做会使导入器的名称空间变得混乱,并使linter更难检测未定义的名称。
您可以将Python全局变量视为“模块”变量,因此它们比C中的传统“全局变量”更有用。
全局变量实际上是在模块的\uuuu dict\uuu
中定义的,可以作为模块属性从模块外部访问。
因此,在您的示例中:
# ../myproject/main.py
# Define global myList
# global myList - there is no "global" declaration at module level. Just inside
# function and methods
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
以及:
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
# You have to make the module main available for the
# code here.
# Placing the import inside the function body will
# usually avoid import cycles -
# unless you happen to call this function from
# either main or subfile's body (i.e. not from inside a function or method)
import main
main.mylist.append("hey")