Python - 词典没有在我的代码中注册

Python - Dictionary isn't being registered in my code

我是 Python 的新手,正在测试自己制作登录和注册帐户数据库类型的东西(非常基本),它都是基于文本的。

某些原因,当我 运行 代码和注册时,它需要 signup() 中的帐户字典,但是当我成功创建帐户时,它不会存储新帐户密钥和信息在 def login() 的 accounts 字典中(因此我也将 accounts 字典放在 signup() 中,否则我会得到一个错误,因为 accounts 字典不存在)请帮忙?

http://imgur.com/wy2vvCZ - link 编码(因为将代码粘贴到此网站似乎有点错误或者我只是愚蠢大声笑)

这是我得到的:

def main(): 

    option = input("Login or sign up? L/S ")

    if option == "L":
        login()
    if option == "S":
        signup()
    else:
        print("Error - restart programm")


def login():

    accounts = {"user123": ["pass123"],
                "123user": ["123pass"], }

    loginUser = input("Enter username: ")
    loginPass = input("Enter password: ")

    if loginUser in (accounts):
        correct1 = 1
        print("Correct")
    else:
        print("Incorrect")

    if loginPass in (accounts[loginUser]):
        correct2 = 1
        print("Correct")
    else:
        print("Incorrect")

    if correct1 and correct2 == 1:
        print("")
        print("Welcome to System")
        print("")

def signup():

        accounts = {"user123": ["pass123"],
                    "123user": ["123pass"], }

        signUser = input("Enter custom username: ")
        signPass = input("Enter custom password: ")

        accounts.update({signUser: [signPass]})

        main()

main()

您有两个不同的函数,loginsignup,每个函数都有自己的局部变量。局部变量的全部意义在于它们只能在该函数内访问。

您要么需要传递值,要么共享变量。

您可以使用参数(和 return 语句来传递值,但本示例不需要这些)。在main函数中创建accounts,然后传给另外两个函数;这样,他们就会拥有相同的字典。

但是您还有另一个问题需要 解决:您不应该在 login 和 [=12] 的末尾调用 main() =];只需要 return,然后在 main 中放置一个 循环 。否则,你每次都会重新开始;任何更改的局部变量都将立即恢复为原始值。

所以:

def main(): 

    accounts = {"user123": ["pass123"],
                "123user": ["123pass"], }

    while True:
        option = input("Login or sign up? L/S ")
        if option == "L":
            login(accounts)
        if option == "S":
            signup(accounts)
        else:
            print("Error - restart programm")
            return

def login(accounts):

    print(accounts)

    loginUser = input("Enter username: ")
    loginPass = input("Enter password: ")

    # etc.

    if correct1 and correct2 == 1:
        print("")
        print("Welcome to System")
        print("")

def signup(accounts):

    signUser = input("Enter custom username: ")
    signPass = input("Enter custom password: ")

    accounts.update({signUser: [signPass]})

main()

我上面提到你需要"pass the values, or share the variables"。第二个呢?

您可以通过创建全局变量来做到这一点。 (或者通过创建 class,并使用实例变量。或者通过在闭包中使用非局部变量。)如果你在所有三个函数的开头写 global accounts,它们都将引用同一个accounts 变量。但是您仍然必须确保不要一遍又一遍地将其重新分配给起始值。

signup() 中的 accounts 字典是 signup() 本地的,这意味着它只能在 signup() 中看到。您还在 login() 中创建了一个新的 accounts,因此即使 signup() accounts 具有全局范围,login() 中对 accounts 的所有引用分配后将引用其本地 accounts 并且看不到 signup()

中所做的更改

由于 accounts 是可变类型,您可以将其作为参数传递给 signup()。在 signup() 中对 accounts 所做的更改将在调用范围中可见,然后您可以在其中将更新后的 accounts 传递给 login().