Python函数正在更改我的输入值,我不明白为什么

2024-06-17 17:32:55 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的第一个问题,所以如果我是一个完全的dweeb张贴这个,让我知道为什么和如何我可以避免它在未来!

我有一些python代码,它们应该只取一个列表,然后将jth组件乘以-1。这是有问题的代码。

def flip(spins,j):
    z = spins
    z[j] = z[j]*-1
    return z

然而,我注意到的是如果我想做

spin = [1,1,1]
test = flip(spin,1)

它会将正确的值[1,-1,1]分配给“test”,但也会将“spin”的值更改为[1,-1,1]。我知道一定有什么明显的东西我正在忽略,但我已经盯着这个2个小时了,仍然看不见。

谢谢你的帮助!


Tags: 代码test列表returndef组件小时spins
3条回答

你忘记的是zspins本质上是同一个对象。两者都指向同一个列表并具有相同的元素。

例如:

a = [0]
b = a

b[0] = 1
print a

结果:

[1]

要复制列表,请尝试以下操作:

a = [0]
b = a[:]

b[0] = 1
print a

结果:

[0]
z = spins

将两个名称放在同一对象上。这种情况在num = old_num中也会发生,但由于您永远无法在原地更改数字(它们是不可变的),所以number = number * -1之类的东西只会给number * -1一个标签number并删除旧的标签。

当你这样做的时候

z[j] = ...

您更改的是z,而不是赋值,这就是为什么这会同时更改标记项的的原因。你想做的是复印一份,你可以这样做:

z = spins[:]     # Traditional way
z = spins(spins) # Pragmatic way
z = spins.copy() # My favorite way

所有这些都同样有效。因为这是一个新项目,更改它不会影响原始项目。

在函数内部,zspins引用同一个列表,该列表的全局名称也是spin。如果修改其中一个,则这些更改也可以通过其他名称看到。变量z是多余的。

如果你想让z成为spins副本,那么就做:

z = spins[:]

或:

z = list(spins)

相关问题 更多 >