我正在尝试在同一个字典中存储多个用户名和密码,而不是启动一个空字典。我的代码现在可以要求输入五次用户名和密码,但它只分别存储每个输入而不是同一个字典。
def store(username, password):
data = {}
data[username] = password
print data
def create():
for i in range(5):
user = raw_input("Username: ")
pas = raw_input("Password: ")
store(user, pas)
我的输出如下:
Username: panda
Password: pandas
{'panda': 'pandas'}
Username: pan
Password: sauce
{'pan': 'sauce'}
Username: hi
Password: name
{'hi': 'name'}
Username: why
Password: so
{'why': 'so'}
所有5个用户名和密码都不存储在同一个字典中,但会创建一个新的字典。我希望输出为以前的用户和密码添加新的用户和密码。
答案 0 :(得分:1)
dict
的目的是允许根据或多或少的任意键检索数据值(有一些限制,但它们不需要关注初学者)。
所以使用单个dict
会更好,其中键是用户名,其对应值是相关密码。
该函数可以使用现有的dict并返回一个新的dict,在这种情况下,您的调用序列将类似于
pwdict = store(pwdict, user, pass)
但由于dict
1是一个可变结构,你也可以在适当的位置改变它。 dict
对你的函数来说可能是全局的,但它更有意义(即它会让你的程序更好地耦合)将它作为参数显式传递给store函数。通过这种方式,读者可以通过阅读调用来看到对象的显式引用。
所以你的代码看起来更像是这样:
passwords = {}
def store(pdict, username, password):
pdict[username] = password
def create():
for i in range(5):
user = raw_input("Username: ")
pas = raw_input("Password: ")
store(passwords, user, pas)
create()
print passwords
这是一个典型的运行:
Username: steve
Password: stevepw
Username: fred
Password: fredpw
Username: me
Password: mepw
Username: you
Password: youpw
Username: them
Password: thempw
{'steve': 'stevepw', 'me': 'mepw', 'you': 'youpw', 'them': 'thempw', 'fred': 'fredpw'}
当然,这使得很明显Python的高级操作确实会产生这样的低级功能,如在dict中存储另一个值而非过度指定。电话
store(passwords, user, pas)
最好用函数体内的语句替换,并写成
passwords[user] = pas
既短又短直接,这意味着读者不必参考任何其他内容来了解正在发生的事情。然后功能是多余的,你的代码更短,所以不会出错!
答案 1 :(得分:1)
每次调用dict
函数时,您都在创建一个新的store
实例。
由于函数也是对象,您可以创建一个dict data
作为函数store
的属性,并使用它来存储username
和password
。< / p>
使用以下任一方法创建一个:
使用setattr
函数:
if not store.__dict__.has_key("data"):
setattr(store, "data", dict())
或直接访问store
的{{1}}
__dict__
您作为商店会员访问if not store.__dict__.has_key("data"):
store.__dict__["data"] = dict()
。
data
这是函数内部静态变量的pythonic等价物。
从本质上讲,您的代码将如下所示:
store.data[username] = password
您可以通过打印def store(username, password):
# Create a
if not store.__dict__.has_key("data"):
store.__dict__["data"] = dict()
store.data[username] = password
print store.data
print id(store.data) # <--- Verify that the same dictionary object is being used again.
的{{1}}来验证是否正在使用相同的dict
对象。
只要每次id
函数被称为新密钥时,用户名都是唯一的,值对就会添加到store.data
,也可以在函数外部访问。
答案 2 :(得分:0)
您需要在store()例程之外的create()例程中创建字典,并将其作为参数传递。尝试:
def store(username, password, dict):
dict[username] = password
print dict
def create():
myDict = {}
for i in range(5):
user = raw_input("Username: ")
pas = raw_input("Password: ")
store(user, pas, myDict)