3 回答
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
创建一个新对象,您可以安全地修改而无需更改另一个对象。
TA贡献1817条经验 获得超6个赞
您正在ids
循环内进行修改,diff = ids
不会创建新对象,只是分配diff
给同一个对象。所以ids
当你修改时你就修改diff
。要解决此问题,请执行以下操作:
diff = ids.copy()
添加回答
举报