Python中的全局变量问题

Python中的全局变量问题,python,Python,我创建了一个小程序,显示一个窗口,询问密码和ID,以检查用户是否保存在数据库中。如果密码正确,则它会将True影响到一个名为mdp\u valide(“password\u is\u valid”(英文)的布尔值,该布尔值以前是False,并破坏连接窗口。它是一个改变该值的函数,所以我在函数顶部使用了一个global语句。但是,当它关闭窗口时,值mdp_valide返回到False 这里有一些代码可以帮助您理解 首先,调用另一个函数的主程序: while 1: mdp_valide, u

我创建了一个小程序,显示一个窗口,询问密码和ID,以检查用户是否保存在数据库中。如果密码正确,则它会将
True
影响到一个名为
mdp\u valide
(“password\u is\u valid”(英文)的布尔值,该布尔值以前是
False
,并破坏连接窗口。它是一个改变该值的函数,所以我在函数顶部使用了一个
global
语句。但是,当它关闭窗口时,值
mdp_valide
返回到
False
这里有一些代码可以帮助您理解

首先,调用另一个函数的主程序:

while 1:
    mdp_valide, utilisateur_en_cours = fenetre_connection(False, None)
    print ('in the main', mdp_valide, utilisateur_en_cours)
    if not mdp_valide:
        sys.exit()
    else :
        lancer_messagerie(utilisateur_en_cours)
然后,不工作的功能:

def fenetre_connection (mdp_val, utilisateur):
    mdp_valide = mdp_val
    utilisateur_en_cours = utilisateur

    root_co = Tk ()

    # .... Lots of stuff

    def verification():
        mdp_co = mot_de_passe.get()
        global mdp_valide
        global utilisateur_en_cours

        if mdp_co == recuperer_donnee_utilisateur (identifiant_utilisateur_co, 'mot_de_passe'): # check if the password is the one of the database

            print ('condition checked')
            mdp_valide = True
            utilisateur_en_cours = identifiant_utilisateur_co
            print ("before destroying : ", mdp_valide, utilisateur_en_cours)
            root_co.destroy()
            print ("after destroying : ", mdp_valide, utilisateur_en_cours)
        else:
            return 1

    Button(Frameboutons_co, text="Valider", font='Cambria', command = verification).pack(side=RIGHT) #Bouton qui verifie la validité du pseudo et du mot de passe


    root_co.mainloop()

    print ('before return : ', mdp_valide)

    return mdp_valide
测试:

before destroying:  True guil23
after destroying :  True guil23
before return :  False None
in the main : False None

问题就在这里:函数验证()确实将mdp_valide的值更改为
True
,但在返回值后,返回到
False

问题是在
fenetre_连接中,
mdp_valide
不是全局的。所以它是一个局部变量。然后在
验证
中,使用
全局mdp_valide
,因此其中一个是全局变量

验证
完成时,您将从
fenetre\u连接
返回局部变量

在Python3中,可以使用
非本地


在python 2中,您可以在
fenetre\u连接中将
mdp\u valide
声明为全局变量,这样这两个变量都在全局范围内,因此是相同的问题是在
fenetre\u连接中,
mdp\u valide
不是全局变量。所以它是一个局部变量。然后在
验证
中,使用
全局mdp_valide
,因此其中一个是全局变量

验证
完成时,您将从
fenetre\u连接
返回局部变量

在Python3中,可以使用
非本地



在python 2中,您可以在
fenetre\u connection
中将
mdp\u valide
声明为全局变量,这样两个变量都在全局范围内,因此是相同的

我在
fenetre\u connection
函数中看不到
global mdp\u valide
。那可能是你的问题。呃,对不起,我把它拿走了。但它是在原来的帖子。我把它放回去了实际上,它已经在那里了,但是你可能被错误的缩进弄错了。我纠正了这个问题,有一个简短的版本说明了这个问题:这是相关的:我在函数
fenetre\u connection
中没有看到
global mdp\u valide
。那可能是你的问题。呃,对不起,我把它拿走了。但它是在原来的帖子。我把它放回去了实际上,它已经在那里了,但是你可能被错误的缩进弄错了。我纠正了它有一个简短的版本说明了这个问题:这是相关的:谢谢,它似乎又起作用了。(我使用全局,因为非局部有点过于复杂:)。但我仍然不明白这怎么可能。“全局”不应该接受“在上面”的某个地方的变量吗?@Guil23-
global
不是指上面的某个地方,而是在模块级别。正如我所理解的,当您有:[Spacename1:somevariable,[Spacename2]],并且希望访问Spacename2中的某个变量时,使用“全局”可以实现这一点access@Guil23在你的情况下,你有:一个不同的
mdp_valide
在全球和
fenetre_连接中(本地)(这将是connexion,顺便说一句)。在
验证
中,您使用的是全局验证。谢谢,它似乎又起作用了。(我使用全局,因为非局部有点过于复杂:)。但我仍然不明白这怎么可能。“全局”不应该接受“在上面”的某个地方的变量吗?@Guil23-
global
不是指上面的某个地方,而是在模块级别。正如我所理解的,当您有:[Spacename1:somevariable,[Spacename2]],并且希望访问Spacename2中的某个变量时,使用“全局”可以实现这一点access@Guil23在你的情况下,你有:一个不同的
mdp_valide
在全球和
fenetre_连接中(本地)(这将是connexion,顺便说一句)。在
验证
中,您使用的是全局验证。