如何在同一个字典中存储用户和密码,而不是新建一个空字典?
我想把多个用户名和密码存储在同一个字典里,而不是从一个空字典开始。现在我的代码可以询问用户名和密码五次,但它每次输入都单独存储,而不是放在同一个字典里。
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'}
这五个用户名和密码并没有存储在同一个字典里,而是创建了一个新的字典。我想要的输出是把新的用户名和密码添加到之前的用户名和密码里。
3 个回答
你需要在create()这个函数里创建你的字典,而不是在store()这个函数里。然后把这个字典作为参数传递进去。试试这样:
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)
每次你调用 store
函数时,都会创建一个新的 dict
实例。
因为函数本身也是对象,你可以把一个名为 data
的字典作为 store
函数的属性,这样就可以用它来存储 username
和 password
。
你可以通过以下两种方法之一来创建这个字典:
使用 setattr
函数:
if not store.__dict__.has_key("data"):
setattr(store, "data", dict())
或者直接访问 store
的 __dict__
属性:
if not store.__dict__.has_key("data"):
store.__dict__["data"] = dict()
你可以把 data
当作 store
的一个成员来访问。
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.
你可以通过打印 store.data
的 id
来验证使用的是同一个 dict
对象。
只要每次调用 store
函数时用户名都是唯一的,就会在 store.data
中添加一个新的键值对,这个字典在函数外部也可以访问。
dict
的目的是让你可以通过一些几乎随意的键来获取数据值(虽然有些限制,但初学者不需要担心这些)。
所以,使用一个包含用户名作为键、对应密码作为值的单一dict
会更好。
这个函数可以接受一个已有的dict
并返回一个新的dict
,在这种情况下,你调用的方式大概是这样的:
pwdict = store(pwdict, user, pass)
不过,由于dict
是一个可变的结构,你也可以直接在原地修改它。这个dict
可以是你函数的全局变量,但将它作为参数明确传递给存储函数会更合理(也就是说,这样可以让你的程序更紧密地结合)。这样,读代码的人在调用时就能清楚地看到这个对象的引用。
所以你的代码看起来会更像这样:
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
这样既简短又直接,读者不需要参考其他内容就能理解发生了什么。这样函数就显得多余,你的代码也更简洁,出错的可能性就更小!