首页 > 解决方案 > 为什么 Python 引用相等不起作用?

问题描述

我有一个带有数组的类,名为self.sheets. 我有一个函数,find_sheet如果传递了字符串,它将对标题进行比较,或者如果传递了 a,则进行引用比较Worksheet。这是一个最小的可重现示例:

class Worksheet:
    pass


class Spread:
    @property
    def sheets(self):
        return [Worksheet() for i in range(5)]

    def find_sheet(self, sheet):
        for ix, obj in enumerate(self.sheets):
            print("comparing {} is {}".format(id(obj), id(sheet)))
            if obj is sheet:
                print("found you")


s = Spread()
s.find_sheet(s.sheets[0])

这输出comparing 140134415396760 is 140134393512344

标签: python

解决方案


我发现了我的问题。当我提到 时s.sheets,它每次都调用属性函数并生成一个新列表。所以当我通过时s.sheets[0],它实际上是一个与迭代时第一个对象不同的对象self.sheets

这里的教训是......使用属性时要小心,它们的行为与变量不同。


推荐阅读