Python 列表中的列表更改,但列表中的变量没有更改?

Python 列表中的列表更改,但列表中的变量没有更改?,python,list,variables,Python,List,Variables,我有点新,我正在研究一个登录机制。所有用户名和密码都存储在类似[[username,passwort],[username,password]]的列表中,然后以以下格式写入文本文件: 用户名 密码 当程序启动时,我想把它们放回用户名和密码列表中。 为此,我编写了一个名为read_from_file()的函数,它从列表(称为user_data)中的文本文件(用户名和密码)中提取两行,然后将该列表添加到主用户列表(称为user_list)[username,password]->(mainlist:

我有点新,我正在研究一个登录机制。所有用户名和密码都存储在类似[[username,passwort],[username,password]]的列表中,然后以以下格式写入文本文件: 用户名 密码

当程序启动时,我想把它们放回用户名和密码列表中。 为此,我编写了一个名为read_from_file()的函数,它从列表(称为user_data)中的文本文件(用户名和密码)中提取两行,然后将该列表添加到主用户列表(称为user_list)[username,password]->(mainlist:)[[username],[password]] 代码如下:

def read_from_file():
    
    user_list = []

    f = open("userdata.txt", "r")

    user_data = ["", ""]
    line_counter = 0

    for x in f:

        user_data[line_counter] = x
        line_counter += 1
        print(line_counter)

        if line_counter == 2:
            print(user_list)
            line_counter = 0
            user_list.append(user_data)
现在我的问题是:当我将用户_数据附加到用户_列表时,第二次附加时,附加到用户_列表的第一个列表也会发生更改,例如:

用户列表=[[Julia,x1234]]

->第二次循环通过

用户列表=[[Nick,doggoXX123],[Nick,doggoXX123]]

事实上应该是这样

用户列表=[[Julia,x1234],[Nick,doggoXX123]]

尽管列表中的第一项应该是[Julia,x1234]

那么我如何阻止它改变呢

现在,它用一个名为i的变量进行了测试,并将其放入一个列表中,然后再次更改该变量,并将其第二次放入列表中,它以我认为应该的方式工作:

def test():

    list = []

    i = 1

    list.append(i)

    i += 1

    list.append(i)

    print(list)
    print(i)
产量为 [1,2] ; 二,

果然

现在为什么这个列表不起作用?
为什么列表会更改而变量不会更改?

您遇到的问题是由于对列表、列表引用以及可能的易变性概念的误解

在本例中,您将名称
user\u data
绑定到列表对象。换句话说,
user\u data
充当内存中实际列表对象的列表引用

当您说
user\u list.append(user\u data)
时,您所做的只是将列表引用附加到
user\u list
。它不会产生深度复制,或者类似的东西。 因此,如果您有两个用户名-密码对,那么您将有两个列表引用,都指向内存中相同的基础列表。通过列表对象的任何引用对列表对象所做的任何更改都将反映在所有其他引用中,因为它们都只是“指向”同一个位置

>>> empty_list = []
>>> lists = [empty_list, empty_list]
>>> lists[0]
[]
>>> lists[1]
[]
>>> lists[0].append(1)
>>> lists[0]
[1]
>>> lists[1]
[1]
>>> 

您在for循环之外声明了用户_数据。因此,在每次迭代中都要修改一个用户_数据,并且每次都要向同一列表添加另一个引用

如果你把名字和密码都存储在一行中,那会更干净。大概是这样的:

name1 pass1
name2 pass2
然后你可以像这样取回

def read_from_file():
    user_list = []
    f = open("userdata.txt", "r")
    for line in f:
       user_list.append(line.split())
    print(user_list)

问题看起来像这里的问题:。请看看这是否回答了您关于行为的问题
def read_from_file():
    user_list = []
    f = open("userdata.txt", "r")
    for line in f:
       user_list.append(line.split())
    print(user_list)