Python,在文件之间导入变量

Python,在文件之间导入变量,python,variables,scope,pygame,python-module,Python,Variables,Scope,Pygame,Python Module,序言:我觉得我可能为一个简单的情况浪费了这么多时间 现在,我正在用pygame制作一个游戏,在某个时候,我想将文件分成两部分,即main.py和configurations.py,以使其更具可读性 一切都很顺利,直到我遇到这个问题 我将在底部分享整个代码,但我想首先总结一下: 首先,在main.py中,我通过 从配置导入* 现在,main.py上的游戏循环取决于运行的变量 变量running在configurations.py中初始化为 因此,main.py必须运行变量,因为它不会给出任何错误,

序言:我觉得我可能为一个简单的情况浪费了这么多时间

现在,我正在用pygame制作一个游戏,在某个时候,我想将文件分成两部分,即main.py和configurations.py,以使其更具可读性

一切都很顺利,直到我遇到这个问题

我将在底部分享整个代码,但我想首先总结一下:

首先,在main.py中,我通过

从配置导入*

现在,main.py上的游戏循环取决于运行的变量

变量running在configurations.py中初始化为

因此,main.py必须运行变量,因为它不会给出任何错误,并在while running语句中使用它

在主循环中,有一部分我检查事件,如下所示

for event in pygame.event.get():
        # check for closing window
        if event.type == pygame.QUIT:
            running = False
这一部分的工作原理和预期的一样,它改变了变量的运行,程序脱离了while循环

现在,问题来了

在其中一个classesPlayer类中,有一个方法是decrease_HP

所以,我希望我能说清楚。我可能对导入变量或变量范围有误解

顺便说一下,我已经尝试在Player.decrease\u HP函数的running=False语句上方添加全局running

>>> running = True
>>> def stop():
...    running = False
...
>>> stop()  # changes only running inside the function
>>> running
True
提前谢谢

文件中的精确代码 main.py 配置.py TLDR:使用导入配置和完全限定名称,例如configuration.running

如果配置中的函数需要修改顶级值,则必须使用全局值

要使更改在整个应用程序中可见,应使用对象并修改其值。一个常见的例子是容器,例如列表

>>> a = [1]
>>> b = a  # a and b point to same value
>>> a == b
True
>>> b[0] = 2  # modify content of value of b
>>> a == b
True
>>> a[0] == b[0]  # content is the same
True
由于模块是对象,所以可以直接使用它们来存储状态

>>> import configuration
>>> b = configuration  # configuration and b point to same value
>>> configuration == b
True
>>> b.running = False  # modify content of value of b
>>> configuration == b
True
>>> configuration.running == b.running  # content is the same
True
函数具有局部范围。对函数内名称的任何赋值都会隐式地将目标声明为函数的本地

>>> running = True
>>> def stop():
...    running = False
...
>>> stop()  # changes only running inside the function
>>> running
True
通过在本地名称具有值之前访问该名称,可以使其可见

>>> running = True
>>> def stop():
...    print(running)
...    running = False
...
>>> stop()
UnboundLocalError: local variable 'running' referenced before assignment
通过声明名称全局,不会创建任何本地名称。全局值可以直接读取和写入

>>> running = True
>>> def stop():
...    global running
...    print(running)
...    running = False
...
>>> stop()  # will print the global value before the change
True
>>> running  # global value was changed
False
TLDR:使用导入配置和完全限定名称,例如configuration.running

如果配置中的函数需要修改顶级值,则必须使用全局值

要使更改在整个应用程序中可见,应使用对象并修改其值。一个常见的例子是容器,例如列表

>>> a = [1]
>>> b = a  # a and b point to same value
>>> a == b
True
>>> b[0] = 2  # modify content of value of b
>>> a == b
True
>>> a[0] == b[0]  # content is the same
True
由于模块是对象,所以可以直接使用它们来存储状态

>>> import configuration
>>> b = configuration  # configuration and b point to same value
>>> configuration == b
True
>>> b.running = False  # modify content of value of b
>>> configuration == b
True
>>> configuration.running == b.running  # content is the same
True
函数具有局部范围。对函数内名称的任何赋值都会隐式地将目标声明为函数的本地

>>> running = True
>>> def stop():
...    running = False
...
>>> stop()  # changes only running inside the function
>>> running
True
通过在本地名称具有值之前访问该名称,可以使其可见

>>> running = True
>>> def stop():
...    print(running)
...    running = False
...
>>> stop()
UnboundLocalError: local variable 'running' referenced before assignment
通过声明名称全局,不会创建任何本地名称。全局值可以直接读取和写入

>>> running = True
>>> def stop():
...    global running
...    print(running)
...    running = False
...
>>> stop()  # will print the global value before the change
True
>>> running  # global value was changed
False

全局运行应该已经解决了问题。不要使用全局来同步状态。是的,使用globals是可能的,不,正确地使用globals并不会减少工作量。有一些表示游戏实例的对象,并在其上设置属性。@Barmar正如我在问题中所说,我尝试了它,但无法使其工作,您说在哪里插入全局运行?@MisterMiyagi您可以提供一个示例作为答案吗?最简单的更改不是从配置导入*,但只需导入配置并使用完全限定的名称,例如configuration.running.global running就可以解决问题。不要使用globals来同步状态。是的,使用globals是可能的,不,正确地使用globals并不会减少工作量。有一些表示游戏实例的对象,并在其上设置属性。@Barmar正如我在问题中所说,我尝试了它,但无法使其工作,您说在哪里插入全局运行?@MisterMiyagi您可以提供一个示例作为答案吗?最简单的更改不是从配置导入*,但只需导入配置并使用完全限定的名称,例如configuration.running。感谢您的努力!我现在读一下,然后看看你链接的另一个答案。谢谢你这么努力!我现在读一下,然后看看你链接的另一个答案。
>>> running = True
>>> def stop():
...    print(running)
...    running = False
...
>>> stop()
UnboundLocalError: local variable 'running' referenced before assignment
>>> running = True
>>> def stop():
...    global running
...    print(running)
...    running = False
...
>>> stop()  # will print the global value before the change
True
>>> running  # global value was changed
False