我对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()
signup()
中的accounts
dict是signup()
的局部dict,这意味着它只能在signup()
中看到。您还在login()
中创建一个新的accounts
,因此即使signup()
accounts
具有全局作用域,在赋值之后对login()
中accounts
的所有引用都将引用其本地accounts
,而不会看到在signup()
中所做的更改因为
accounts
是可变类型,所以可以将其作为参数传递给signup()
。对signup()
中accounts
所做的更改将在调用作用域中可见,然后您可以将更新的accounts
传递给login()
。你知道吗有两个不同的函数,
login
和signup
,每个函数都有自己的局部变量。局部变量的关键是它们只能在函数中访问。你知道吗您要么需要传递值,要么共享变量。你知道吗
您可以使用参数(和
return
语句)传递值,但本例中不需要这些参数。在main
函数中创建accounts
,然后将其传递给其他两个函数;这样,它们将拥有相同的字典。你知道吗但是您也有另一个问题需要解决:您不应该在
login
和signup
的末尾调用main()
;只要让它们return
,并在main
中放入一个循环。否则,每次都会重新开始;任何更改的局部变量都会返回到其原始值。你知道吗所以:
我在上面提到,您需要“传递值,或者共享变量”。第二个呢?你知道吗
可以通过创建全局变量来实现这一点。(或者通过创建一个类,并使用实例变量。或者在闭包中使用非局部变量。)如果在所有三个函数的开头编写
global accounts
,它们都将引用相同的accounts
变量。但您仍然必须确保不要不断地将其重新指定给起始值。你知道吗相关问题 更多 >
编程相关推荐