gpt4 book ai didi

python - 在 Python 中评估为相等的非等效变量

转载 作者:行者123 更新时间:2023-11-28 21:20:37 26 4
gpt4 key购买 nike

因此,在测试一些代码时,我在 Python 中发现了一些奇怪的功能,即两个具有不同值的变量被评估为相等。产生上述行为的代码如下

class Foo:
def __init__(self):
self.x = [1,2,3]
self.y = self.x

def ChangeX(self):
self.x.append(4)

def equals(self):
print(self.x==self.y)

当我运行这段代码时,变量会按应有的方式初始化。如果我跑

f = Foo()
f.equals()

输出为 True,我可以理解,因为此时 f.x 和 f.y 都具有相同的值。然而,当我运行时

r = Foo()
r.ChangeX()
r.equals()

输出仍然为真。这让我很困惑。 r.x 和 r.y 显然不再具有相同的值(按顺序打印它们甚至会给出不同的输出),但 Python 似乎认为这两个变量彼此相等。

我有一种预感,这与我正在使用一个类有关;但是我仍然不知道这里到底发生了什么或如何“修复”它。有人可以解释吗?

最佳答案

self.xself.y 都引用内存中的同一个列表对象。这意味着,当您更新一个时,另一个将反射(reflect)更改。

您可以在下面的演示中看到此行为:

>>> a = [1, 2, 3]
>>> b = a
>>>
>>> # The contents of a and b are the same
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>>
>>> # And their ids are the same
>>> id(a)
33908856
>>> id(b)
33908856
>>>
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
>>>

如果你想改变这种行为,你可以将 self.y 分配给 self.x 的浅拷贝:

self.y = self.x[:]

请看下面的演示:

>>> a = [1,2,3]
>>> b = a[:]
>>>
>>> # The contents of a and b are the same
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>>
>>> # But their ids are different
>>> id(a)
33984680
>>> id(b)
33984960
>>>
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3]
>>>

关于python - 在 Python 中评估为相等的非等效变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22592847/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com