如何解决为什么使用全局变量给出未定义?
我似乎无法弄清楚我的变量出了什么问题。基本上,我的main.py中有一个变量,需要在function.py中的一个函数中进行调整。但是我收到一个错误,该变量尚未定义。
我在做什么错了?
main.py:
from function.functions import *
loaded_tables = []
do_something()
functions.py:
def do_something():
global loaded_tables
loaded_tables.append('test')
解决方法
Python中的全局变量不是真正的全局变量,它们是module-scoped。这意味着您将能够从模块loaded_tables
中的任何功能访问main
。如果要在其他任何模块中使用它,则必须将其导入。在您的情况下,这将使您循环导入,因此无法正常工作。
正如@ 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']
更改:
- 如other answer中所述,
loaded_tables
名称仅适用于main.py模块,而不能用于functions.py。说global
并不会告诉Python在main
模块(或其他文件)中寻找它。 - 除非确实确实需要,否则请避免使用全局变量。您可能需要阅读Why are global variables evil?。在这种情况下,与其问“ 如何使全局变量工作”,不如考虑“ 如何在没有全局变量的情况下重构此变量”。如果您的
main
模块包含data
,并且functions
模块应该基于该模块执行某些操作,则只需将参数传递给该函数(“执行某项操作”所需的参数),然后将结果返回给main。然后,仅在主模块上完成数据上的所有变异。这使它更具模块化,并且在编写测试时很有用,因为该功能可以独立于loaded_tables
进行测试。 - 避免执行
import *
。也许这只是示例代码的简化,但是仍然最好显式导入所需的内容。它会使调试变得困难,并使您的IDE难以发挥其智能感知能力。参见Why is “import *” bad?。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。