(疑似 BUG)仅操作一个类实例方法修改实例属性,但多其他同时初始化的类实例属性一同被修改了

2019-01-20 12:50:32 +08:00
 Ccob

有人碰过类似的问题吗?

代码大致如下:


class A():

    def __init__(self):
        self.foo = 'test'

    @property
    def foo(self):
        return self._foo

    @foo.setter
    def foo(self, foo):
        self._foo = foo

class B():

    def __init__(self):
        self.instance1 = A()
        self.instance2 = A()

    def test(self):
        self.instance1.foo = 'testChange'

        print(self.instance1.foo)
        print(self.instance2.foo)

B().test()

以上代码输出是:

testChange
test

而在实际代码中,仅仅修改一个实例属性,另一个实例属性同步被修改了,即出错输出是:

testChange
testChange

折腾了我一天了,实在无奈

代码检查过,确认不是写错; git diff 过,确认修改没有问题;查看过两个实例的地址,确认过不同;怀疑过虚拟机问题,重启过,没用;怀疑过 pycache 问题,清空过,没用

然而坚信科学不信邪不信神的我,一通调试之后,发现,莫名其妙好了........................

相关环境:

1545 次点击
所在节点    Python
6 条回复
CSM
2019-01-20 13:24:34 +08:00
这种玄学问题我遇到过多次。开始几次在突然变好之后就没再调查了,以可能是某种不易复现的 bug、我眼花了、智子的干扰等理论搪塞过去了。直到上一次再次遇到,我决定主动出击,在结合了 shell 的历史记录、编辑器的撤销以及使劲的回想后终于发现,是我的代码写错了,后来莫名其妙好了是因为不知道什么时候改了代码。

所以我觉得你一定是写了两行那个赋值语句或者什么的没看清楚。
whoami9894
2019-01-20 13:28:02 +08:00
解释器应该不会有这种 bug,猜测可能是一些没注意到的小失误比如两次打印都写成 instance1 了
Ccob
2019-01-20 13:41:21 +08:00
@CSM 我一开始就是以为我写错了,所以最开始就排查是不是写错了,把能注释的全注释了,剩下的几乎就是贴出来那段了。但这过程毕竟也是改了代码,没存档,也没法回顾是不是当时检查看错了。。。
Ccob
2019-01-20 13:42:50 +08:00
@whoami9894 最开始就是这么排查的。。。然后一天也没查出有写错的地方 T_T
binaryify
2019-01-20 14:03:27 +08:00
会不会是编辑器 bug,显示文件内容和实际文件内容不符
Ccob
2019-01-20 15:35:43 +08:00
@binaryify 有可能^_^ 不纠结了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/528774

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX