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