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

以下 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 个周期(对于偶数)。在这里,我将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]


红颜莎娜
浏览 64回答 3
3回答

跃然一笑

我想你想要diff = ids.copy()您所拥有的意思diff只是指向ids,因此当您从 中删除元素时diff,您也会从 中删除元素ids。

守着一只汪

这是因为对象在 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 memory0140088760329608 ##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 ids0140088759071496 ##Object id for diffs创建一个新对象,您可以安全地修改而无需更改另一个对象。

慕的地6264312

您正在ids循环内进行修改,diff = ids不会创建新对象,只是分配diff给同一个对象。所以ids当你修改时你就修改diff。要解决此问题,请执行以下操作:diff = ids.copy()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python