Python字典没有在我的cod中注册

2024-06-26 14:53:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python非常陌生,正在测试自己的登录和注册帐户数据库类型(非常基本),它都是基于文本的。你知道吗

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

http://imgur.com/wy2vvCZ-链接到代码(因为将代码粘贴到这个网站似乎有点麻烦,或者我只是个傻瓜lol)

我得到的是:

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()

Tags: 代码inputif字典maindeflogin帐户
2条回答

signup()中的accountsdict是signup()的局部dict,这意味着它只能在signup()中看到。您还在login()中创建一个新的accounts,因此即使signup()accounts具有全局作用域,在赋值之后对login()accounts的所有引用都将引用其本地accounts,而不会看到在signup()中所做的更改

因为accounts是可变类型,所以可以将其作为参数传递给signup()。对signup()accounts所做的更改将在调用作用域中可见,然后您可以将更新的accounts传递给login()。你知道吗

有两个不同的函数,loginsignup,每个函数都有自己的局部变量。局部变量的关键是它们只能在函数中访问。你知道吗

您要么需要传递值,要么共享变量。你知道吗

您可以使用参数(和return语句)传递值,但本例中不需要这些参数。在main函数中创建accounts,然后将其传递给其他两个函数;这样,它们将拥有相同的字典。你知道吗

但是您也有另一个问题需要解决:您不应该在loginsignup的末尾调用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()

我在上面提到,您需要“传递值,或者共享变量”。第二个呢?你知道吗

可以通过创建全局变量来实现这一点。(或者通过创建一个类,并使用实例变量。或者在闭包中使用非局部变量。)如果在所有三个函数的开头编写global accounts,它们都将引用相同的accounts变量。但您仍然必须确保不要不断地将其重新指定给起始值。你知道吗

相关问题 更多 >