pop() 函数在 python 中是如何工作的?它没有以我期望的方式工作



我在python中的一个类中有以下几行代码:

1        for i in range(len(self.rg_nodes_range)):
2            tmp_rg = self.rg_nodes_range
3            tmp_rg.pop(i)

self的值rg_nodes_range为:

self.rg_nodes_range = [20, 21]

我希望在每个循环开始时,tmp_rg获得[20,21]的值,然后在第3行中,从tmp_rg中删除相应的索引(I(。例如,我希望tmp_rg在第一次迭代结束时为[21](当I==0时(,在第二次迭代结束时(当I==1时([20]

但这似乎并没有发生。我放了一些断点,发现在第一次迭代中,在第3行,tmp_rgself.rg_nodes_range都从[20,21]变为[25]。我用这几行代码仔细检查了一下:

p = [1, 2, 3]
tp = p
tp.pop(0)
print(p)
print(tp)

输出为(ptp均发生变化(:

[2, 3]
[2, 3]

你知道这里发生了什么吗?如何修复它以获得预期的输出?非常感谢。

这不是pop()问题。该函数按预期工作,您需要查找的是深度副本与浅层副本的概念,因为在python中,当您将一个变量分配给其他变量时,它只是创建一个浅层副本,因此修改原始副本也会修改副本。但是,如果创建深度副本,它将克隆对象,从而允许您单独修改它们。

所以这个:

p = [1, 2, 3]
tp = p
tp.pop(0)
print(p)
print(tp)

生产:

[2, 3]
[2, 3]

然而:

p = [1, 2, 3]
tp = p.copy()
tp.pop(0)
print(p)
print(tp)

产生

[1, 2, 3]
[2, 3]

相关内容

最新更新