为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

红颜莎娜 2023-12-12 15:23:29
以下 for 循环将按ids预期打印列表中的每个元素:ids = [0,1,2,3,4,5,6,7,8,9]for item in ids:    print(item)0123456789然而,当我构造一个应生成两个随机数的 for 循环时,该循环仅经历 5 个周期(对于偶数)。在这里,我将diffids设置为等于删除当前项目编号的 集合。diff应该是一组 9 个数字(因此,对于第一个循环diff将是[1,2,3,4,5,6,7,8,9],在第二个循环diff中将是 [0,2,3,4,5,6,7,8,9] 等...但是会发生什么列表中的奇数ids被完全跳过。当我ids在 for 循环中根本没有修改列表时,为什么会发生这种情况?ids列表是如何修改的?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 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

我想你想要

diff = ids.copy()

您所拥有的意思diff只是指向ids,因此当您从 中删除元素时diff,您也会从 中删除元素ids


查看完整回答
反对 回复 2023-12-12
?
守着一只汪

TA贡献1872条经验 获得超3个赞

这是因为对象在 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 或 ids,总是会修改该对象,因此当您调用它(使用 diff 或 ids)时,您将收到相同的修改后的对象。


正如 Collin 建议的那样,您可以使用以下方法.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

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


查看完整回答
反对 回复 2023-12-12
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

您正在ids循环内进行修改,diff = ids不会创建对象,只是分配diff同一个对象。所以ids当你修改时你就修改diff。要解决此问题,请执行以下操作:

diff = ids.copy()


查看完整回答
反对 回复 2023-12-12
  • 3 回答
  • 0 关注
  • 55 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信