如何在同一个字典中存储用户和密码,而不是新建一个空字典?

1 投票
3 回答
1368 浏览
提问于 2025-04-18 16:35

我想把多个用户名和密码存储在同一个字典里,而不是从一个空字典开始。现在我的代码可以询问用户名和密码五次,但它每次输入都单独存储,而不是放在同一个字典里。

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 个回答

0

你需要在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)
1

每次你调用 store 函数时,都会创建一个新的 dict 实例。

因为函数本身也是对象,你可以把一个名为 data 的字典作为 store 函数的属性,这样就可以用它来存储 usernamepassword

你可以通过以下两种方法之一来创建这个字典:

使用 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.dataid 来验证使用的是同一个 dict 对象。

只要每次调用 store 函数时用户名都是唯一的,就会在 store.data 中添加一个新的键值对,这个字典在函数外部也可以访问。

1

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

这样既简短又直接,读者不需要参考其他内容就能理解发生了什么。这样函数就显得多余,你的代码也更简洁,出错的可能性就更小!

撰写回答