Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中将用户输入添加到列表时遇到问题_Python_List_Input_Append - Fatal编程技术网

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

在python中将用户输入添加到列表时遇到问题,python,list,input,append,Python,List,Input,Append,我一直在研究一个用于教育目的的密码保管器,希望用户能够创建一个帐户,如果他们还没有。我认为最好的办法是为用户名和密码分别列出一个单独的列表。如果用户正在创建一个帐户,只需将用户名和密码附加到各自的列表中,它不会附加任何内容。也许我的语法错了?我查了几个网站来检查我的语法,一切看起来都很好。我错过了什么 以下是相关的代码块: def main(): users=['ari'] passwords=['rycbar1234'] # This is the "title scr

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

以下是相关的代码块:

def main():
    users=['ari']
    passwords=['rycbar1234']
    # This is the "title screen"
    print('_____This is a password keeper_____')
    # checking if the user has an account
    actCheck = input('Do you already have an account?')
    if actCheck == 'Yes' or actCheck == 'yes':
        # asking for user's name and password
        yourUser = input('___What is your Username?___')
        yourPass = input('___What is your Password?___')
        if (yourUser in users and yourPass in passwords):
            dirCheck = input('Account settings?[y,n]')
            if dirCheck == 'y' or dirCheck == 'Y':
                # This is the start of the password/username thing
                print('this function is not working yet!')
                actSetCheck = input('Change username or password?')
                if (
                                        actSetCheck == 'user' or actSetCheck == 'User' or actSetCheck == 'Username' or actSetCheck == 'username'):
                    yourNewUser = input('What would you like your new username to be?')
                elif (
                                        actSetCheck == 'pass' or actSetCheck == 'Pass' or actSetCheck == 'password' or actSetCheck == 'Password'):
                    yourNewPass = input('What would you like your new password to be?')
            elif dirCheck == 'n' or dirCheck == 'N':
                request()
        # incorrect password thing
        else:
            print('Incorrect Username or password')
    else:
        print('This function is not working yet!')
        createAct = input('Would you like to create one?')
        if createAct == 'yes' or createAct == 'Yes':
            createUser = input('What would you like your username to be?')
            createPass = input('What would you like your password to be?')
            users.append(createUser)
            passwords.append(createPass)

        else:
            main()


main()

第36行有语法错误<代码>密码。肯定是无效语法。您可能打算编写
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
这里,
用户名[0]
密码[0]
与同一用户关联。但是,当我们改变其中一个列表的某些内容而不改变另一个列表时,会发生什么呢?如果我们继续前面的代码并执行以下命令:

>>> passwords.sort()
突然之间,无法保证
用户名[0]
密码[0]
与同一用户关联。现在使用元组而不是并行列表:

>>> users = []
>>> for i in range(5):
...     username = input("Username:")
...     password = input("Pass:")
...     users.append((username,password))
我们已显式链接用户名和密码,因为它们存储在同一个对象中。现在当我们执行:

>>> users.sort()

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

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

passwords.
这是一个语法错误。不过,我怀疑这只是一个打字错误

我认为您真正的问题在于,您试图将“用户”和“密码”作为局部变量存储在main()中,更新它们,然后递归调用main()

由于“用户”和“密码”是本地变量,因此它们将在上一次调用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'])
对于通过方法:

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'])

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

我认为你遗漏了一些字符……请你详细说明一下,你的最后一行不完整。你的线路只是密码。@JoranBeasley它已经修好了。谢谢再加上你说的,如果你不使用元组,并且不知何故丢失了一个用户名或密码,那么整个列表都是错误的。OP绝对应该从两个数组切换到一个tuplesYep数组!我没听清楚密码的语法。但用户名也没有追加。即使在做了一些研究之后,我也很难理解你在最后一点说的话和你的例子。你能试着用另一种或更具体的方式解释一下吗?谢谢为了清楚起见,请列出一个元组列表。因此,一旦帐户被创建,它将被创建在一个元组中,元组将被放置在一个列表中。另外,当我在append语句中有“createUser”或“createPass”时,我的IDE似乎期待着另一件事,我不确定会发生什么。@AriMadian请根据您的请求查看我的编辑。此外,一旦找到适合您的解决方案,请接受答案。感谢您的编辑!它帮助我理解了你想说的话。不过有一件事,我看到你和其他人在这个线程中使用类似于“for I in range(5):”的字符串。这样做的目的是什么?那么,为了明确起见,要采用全局方法,只需将列表移到函数之外?就这样?我试过了,但不起作用,所以我尝试在createUser和createPass上使用“global”语句,但仍然不起作用。有什么想法吗?你不应该需要全局关键字——只要在文件范围内声明就可以了。Global关键字用于从函数中创建或重新分配全局变量。另一个问题是对main()的递归调用的嵌套。只有当用户对创建帐户回答“否”时,才会调用它,否则将返回main()。我建议去掉else,将对main()的递归调用移动到整个def main():块中。仍然无法处理全局对象。。。有什么想法吗?不过我已经解决了main()的问题。嗯,我试着对你的代码做了那些修改,结果成功了。我建议为用户和密码添加print语句(例如,在main的开头)并从那里进行调试。谢谢,我尝试使用print语句和另一个编辑,append命令可以工作,但仅在“会话”期间有效。