我似乎无法弄清楚我的变量做错了什么。基本上,我在main.py中有一个变量,我需要在function.py中的一个函数中对其进行调整。但我收到一个错误,即变量尚未定义。
我做错了什么?
main.py:
from function.functions import *
loaded_tables = []
do_something()
函数.py:
def do_something():
global loaded_tables
loaded_tables.append('test')
Python中的全局变量不是真正的全局变量,它们是模块范围的。这意味着您可以从模块main
中的任何函数访问loaded_tables
。如果你想在任何其他模块中使用它,你必须导入它。在你的情况下,这会给你一个循环导入,因此无法正常工作。
正如@klaus-d在他们的评论中所建议的那样,避免全局变量并简单地将参数传递给函数是一种很好的做法。
如果你真的想使用全局变量,你可以在一个单独的模块(例如app_globals.py
(中定义它们,并在需要访问它们时从那里导入它们。
让我们试着解决这个问题,同时避免一些不良做法。
这是修改后的函数.py:
def do_something(params):
# computing something based on params..
return 'test'
这是修改后的main.py:
from functions import do_something
loaded_tables = []
print(loaded_tables)
result = do_something(123)
loaded_tables.append(result)
print(loaded_tables)
运行它:
$ python main.py
[]
['test']
更改:
- 如另一个答案中所述,
loaded_tables
名称的作用域仅限于main.py模块,它对functions.py不可用。说global
并不会告诉Python在main
模块(或其他文件(中查找它 - 避免全局变量,除非你真的真的需要。你可能想读一读为什么全局变量是邪恶的?。与其问如何使全局工作";,在这种情况下如何在没有全局变量的情况下重构它";。如果您的
main
模块包含data
,而functions
模块应该基于它进行一些操作,只需将参数传递给函数("做某事"所需的参数(,然后将结果返回到main。然后,数据上的所有突变都只在主模块上进行。这使得它更加模块化,并且在编写测试时很有帮助,因为该功能可以独立于loaded_tables
进行测试 - 避免执行
import *
。也许这只是示例代码的简化,但最好还是显式导入您需要的内容。它可能会使调试变得困难,并使IDE难以发挥其智能性。请参阅为什么"import*"不好