Python-字典不是';我的代码中没有注册

Python-字典不是';我的代码中没有注册,python,database,passwords,accounts,Python,Database,Passwords,Accounts,我对Python非常陌生,当时正在测试自己如何创建一个登录和注册帐户数据库类型的东西(非常基本),它都是基于文本的 出于某种原因,当我运行代码并注册时,它需要注册()中的accounts dictionary,但当我成功创建帐户时,它不会在def login()中的accounts dictionary中存储新的帐户密钥和信息(因此我将accounts dictionary放在signup()中)太多,因为否则我会得到一个帐户错误(字典不存在)请帮助 -代码链接(因为将代码粘贴到此网站似乎有点问

我对Python非常陌生,当时正在测试自己如何创建一个登录和注册帐户数据库类型的东西(非常基本),它都是基于文本的

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

-代码链接(因为将代码粘贴到此网站似乎有点问题,或者我只是个傻瓜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()

您有两个不同的函数,
login
signup
,每个函数都有自己的局部变量。局部变量的全部要点是它们只能在该函数中访问

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

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

但是您还有另一个问题需要解决:您不应该在
login
signup
结束时调用
main()
;只需让它们返回
,并在
main
中放置一个循环即可。否则,你每次都会重新开始;任何被更改的局部变量都将返回其原始值

因此:


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


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

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


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

将代码粘贴到此站点不是错误的,您只需将其格式化为代码选择它并使用
{}
按钮,或者在每行的开头手动添加4个空格。作为旁注,您不需要
帐户。更新({signUser:[signPass]})
;只需
accounts[signUser]=[signPass]
。此外,除非您试图编写与Python 2.x和3.x兼容的代码,否则您不需要
print(“”)
,只需
print()
就可以了。谢谢,这些技巧都是一流的。非常感谢您,这篇文章解释得很好,非常有用,我整晚都在努力想办法解决这个问题,现在它是我的!谢谢你,阿巴内特。
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()