【问题标题】:List in list changes but var in list not? [duplicate]列表中的列表更改但列表中的 var 没有? [复制]
【发布时间】:2020-09-19 11:04:55
【问题描述】:

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

                                      for example:   Julia
                                                     x1234
                                                     Nick
                                                     doggoXX123
                                      and so on

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

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)

现在我的问题是:当我将 user_data 附加到 user_list 时,第二次附加它时,附加到 user_list 的第一个列表也会发生变化:

user_list = [[Julia, x1234]]

-> for 循环第二次通过

user_list = [[尼克,doggoXX123],[尼克,doggoXX123]]

实际上应该是

user_list = [[Julia, x1234],[Nick, doggoXX123]]

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

那么我该如何阻止它改变呢?

现在它用一个名为 i 的 var 对其进行了测试并将其放入一个列表中,然后再次更改该 var 并将其第二次放入列表中,它按照我的想法工作:

def test():

    list = []

    i = 1

    list.append(i)

    i += 1

    list.append(i)

    print(list)
    print(i)

输出是 [1,2] ; 2

正如预期的那样

现在为什么这不适用于列表? 为什么列表会改变而 var 不会?

【问题讨论】:

标签: python list variables


【解决方案1】:

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

在您的情况下,您将名称 user_data 绑定到列表对象。换句话说,user_data 充当对内存中实际列表对象的列表引用。

当您说user_list.append(user_data) 时,您所做的只是将列表引用附加到user_list。它不会制作深拷贝或类似的东西。 因此,如果您有两个用户名-密码对,那么您将有两个列表引用,它们都指向内存中的同一个底层列表。您通过列表对象的任何引用对列表对象所做的任何更改都将反映在所有其他引用中,因为它们都只是“指向”同一个地方。

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

【讨论】:

    【解决方案2】:

    您在 for 循环之外声明了 user_data。因此,您在每次迭代中都在修改一个 user_data,并且每次都将另一个引用附加到同一个列表。

    如果您将名称和密码分别存储在一行中,那将会更加简洁。像这样的:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 2019-03-09
      • 1970-01-01
      相关资源
      最近更新 更多