代码之家  ›  专栏  ›  技术社区  ›  the_darkside

简单循环中意外的列表丢失

  •  0
  • the_darkside  · 技术社区  · 5 年前

    下面的for循环将打印列表中的每个元素 ids 正如所料:

    ids = [0,1,2,3,4,5,6,7,8,9]
    
    for item in ids:
        print(item)
    
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    

    然而,当我构造一个应该生成两个随机数的for循环时,循环只经过5个周期(偶数)。给,我准备好了 差别 等于 身份证 删除当前项目编号。 diff 应该是一组9个数字(因此,对于第一个循环 差别 会是 [1,2,3,4,5,6,7,8,9] ,在第二个循环中 差别 会是[0,2,3,4,5,6,7,8,9]等等。。。但发生的是奇数的 身份证 列表被完全跳过。为什么我不修改 身份证 在for循环中列出所有内容?天气怎么样 身份证 正在修改列表?

    ids = [0,1,2,3,4,5,6,7,8,9]
    
    for item in ids:
        print(item)
        diff = ids
        diff.remove(item)
        test = random.sample(diff, 2)
        print(test)
    
    0
    [8, 2]
    2
    [8, 5]
    4
    [1, 6]
    6
    [9, 8]
    8
    [7, 3]
    
    3 回复  |  直到 5 年前
        1
  •  1
  •   Jace    5 年前

    我想你想要

    diff = ids.copy()
    

    你所拥有的意味着什么 diff 只是指 ids ,所以当您从 差别 ,您还将从中删除元素 身份证 .

        2
  •  1
  •   Collin Heist    5 年前

    你在修改 ids 在循环内部, diff = ids 不会创造一个 刚出现的 对象,只分配 diff 相同的 对象所以你修改了 身份证 当你修改 差别 .要解决此问题,请执行以下操作:

    diff = ids.copy()
    
        3
  •  1
  •   Celius Stingher    5 年前

    这是因为对象是如何在python内存中管理的。虽然您可能定义了两个不同的变量,但实际上并没有定义两个不同的对象。这两个名字 diff ids 指的是Python内存中的同一个对象。因此,当您修改一个列表时,您也将修改另一个列表,每次迭代发生时都会改变for循环的过程。我对你的循环做了一些修改,这样你就能明白我的意思了:

    ids = [0,1,2,3,4,5,6,7,8,9]
    print(id(ids))
    for item in ids:
        print(item)
        diff = ids
        print(id(diff))
        diff.remove(item)
        test = random.sample(diff, 2)
        print(test)
    

    我在前两次迭代中得到以下输出:

    140088760329608 ##This is the id for ids in Python's memory
    0
    140088760329608 ##This is the id for the diff in Python's memory
    

    因此,无论我们如何命名,修改diff或id都将始终修改对象,因此当您调用它(使用diff或id)时,您将收到相同的修改对象。

    正如科林所建议的,你可以使用 .copy() 为了防止这种情况发生:

    ids = [0,1,2,3,4,5,6,7,8,9]
    print(id(ids))
    for item in ids:
        print(item)
        diff = ids.copy()
        print(id(diff))
        diff.remove(item)
        test = random.sample(diff, 2)
        print(test)
    

    返回:

    140088759855944 ##Object id for ids
    0
    140088759071496 ##Object id for diffs
    

    创建一个可以安全修改的新对象,而无需更改另一个对象。

    推荐文章