将用户输入添加到python中的列表时遇到问题

时间:2016-04-08 23:05:43

标签: python list input append

为了教育目的,我一直在为密码管理员工作,并希望用户能够创建一个帐户,如果他们还没有。我认为最好的方法是为用户名和密码设置一个单独的列表。如果用户正在创建帐户,只需将用户名和密码附加到各自的列表中,它就不会附加任何内容。也许我的语法错了?我查了几个网站来检查我的语法,一切看起来都不错。我错过了什么?

这里是相关的代码块:

import numpy as np

def float_to_int(array):
    int_array = array.astype(int, casting='unsafe', copy=True)
    if not np.equal(array, int_array).all():
        raise TypeError("Cannot safely convert float array to int dtype. "
                        "Array must only contain whole numbers.")
    return int_array

2 个答案:

答案 0 :(得分:0)

第36行有语法错误。 passwords.当然不是有效的语法。你可能想写password.append(createPass),这也可以解释为什么一切都没有附加。

此外,我确定您已经意识到这一点,但在课堂或学术界的背景下这是非常不安全的事情。存储密码时,应始终在存储之前加盐并适当散列。

最后请注意,将用户名和密码存储在元组中然后将它们放入列表中可能会更清晰。这会将用户和密码绑定到单个对象,允许您对列表进行排序。正如你现在所做的那样,这比并行数组/列表更受欢迎,因为这个事实(它也更加pythonic)。

举例来说:

users = []
for i in range(num_new_users):
     user = input("username:")
     pass = input("pass:")
     users.append((user,pass))
users.sort()

修改

为了进一步详细解释,元组是Python中的内置类型。它是通过在括号中包装一些项目而形成的。元组对于将几个对象彼此关联非常有用。在许多情况下,我们更喜欢它们列出,因为它们是不可变的。这意味着您无法在创建后更改其值或大小,但仍可使用熟悉的列表表示法访问它们。创建元组的一个简单示例如下:

>>> x = (1,2)
>>> print x
(1,2)
>>> print x[0]
1
>>> x[1] = "hello"
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

这在您的示例中有用的原因是因为它从两个列表开始,您假设任何索引对应于同一个用户,直到您知道它们的一个列表。考虑这个例子:

>>> usernames = []
>>> passwords = []
>>> for i in range(5):
...     usernames.append(input("Username:"))
...     passwords.append(input("Pass:"))

此处,usernames[0]password[0]与同一用户相关联。但是当我们改变其中一个列表而没有另一个列表时会发生什么?如果我们继续使用前面的代码并执行以下命令:

>>> passwords.sort()

突然之间无法保证usernames[0]password[0]与同一用户相关联。现在使用元组而不是并行列表:

>>> users = []
>>> for i in range(5):
...     username = input("Username:")
...     password = input("Pass:")
...     users.append((username,password))

我们已明确链接用户名和密码,因为它们存储在同一个对象中。现在我们执行:

>>> users.sort()

我们可以保证user[0]返回的信息始终相互关联。在python解释器中尝试这两个示例。使用大量的打印语句,以便您可以看到正在发生的事情。希望你能看到这是一种更好的做事方式。

答案 1 :(得分:0)

首先,在“不工作”区域,你有:

passwords.

哪个是语法错误。我怀疑这只是一个错字。

我认为你真正的问题是你试图将'users'和'password'存储为main()中的局部变量,更新它们,然后递归调用main()。

由于'users'和'password'是局部变量,因此它们将在之前的main调用中更新。但是,新调用中的变量是完全独立的。

要解决这个问题,要么将它们设为全局变量,要么将它们传递给main。对于全球方法:

users = ['user']
passwords = ['default']

def main():
  # use the 'users' and 'passwords' as usual

传入方式:

def main(users, passwords):
  # use 'users' and 'passwords' as usual

main(['user'], ['password'])

当然,除非您知道自己在做什么,否则不要尝试实施真实的密码系统:)