如何存储用户并传入相同的字典而不是新的空字典?

时间:2014-08-08 17:32:32

标签: python dictionary

我正在尝试在同一个字典中存储多个用户名和密码,而不是启动一个空字典。我的代码现在可以要求输入五次用户名和密码,但它只分别存储每个输入而不是同一个字典。

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个用户名和密码都不存储在同一个字典中,但会创建一个新的字典。我希望输出为以前的用户和密码添加新的用户和密码。

3 个答案:

答案 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的属性,并使用它来存储usernamepassword。< / 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)