Python的全局变量问题

时间:2017-04-10 15:46:43

标签: python

我创建了一个小程序,它显示一个窗口并询问密码,id,以检查用户是否保存在数据库中。如果密码正确,那么它会True影响一个名为mdp_valide的布尔值(英文中的'password_is_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

问题在于:函数verification()确实将mdp_valide的值更改为True,但在返回值后,它又返回到False

1 个答案:

答案 0 :(得分:2)

问题在于fenetre_connectionmdp_valide不是全球性的。所以它是一个局部变量。然后在verification中使用global mdp_valide,这样一个是全局变量。

verification完成后,您将从fenetre_connection返回本地变量。

在python 3中,您可以使用nonlocalhttps://docs.python.org/3/reference/simple_stmts.html#the-nonlocal-statement

在python 2中,您可以在mdp_valide中将fenetre_connection声明为全局,以便两个变量都在全局范围内,因此是相同的