提问者:小点点

在文件之间使用全局变量?


我对全局变量是如何工作的有点困惑。我有一个大项目,大约有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写作或泡菜,我不想这样做。


共3个答案

匿名用户

问题是您从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")