У меня есть класс с массивом под названием self.sheets
. У меня есть функция find_sheet
, которая будет сравнивать заголовки, если передается строка, или сравнивать ссылки, если передается 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
чем они разные объекты? Я пропускаю obj.sheets[0]
, затем в pdb
останавливаюсь на первой итерации enumerate(self.sheets)
, которая должна быть такой же, как self.sheets[0]
(и в этом случае self
= obj
)
мы можем только предполагать, если вы не предоставите минимальный воспроизводимый пример . кажется довольно ясным, это все разные объекты
В качестве примечания, isinstance(sheet, Worksheet)
, вероятно, не требуется. if sheet is worksheet:
должно хватить.
Работает на меня. Он печатает found you
Если он работает так, как ожидалось, то это не воспроизводимый пример, и мы все равно не можем вам помочь. Попробуйте снова.
Вы, ребята, правы, я нашел свою проблему ... оставив вопрос и ответ здесь, если это поможет кому-то еще
Я понял свою проблему. Когда я ссылаюсь на s.sheets
, он вызывает функцию свойств и каждый раз создает новый список. Поэтому, когда я передаю s.sheets[0]
, это фактически другой объект, чем первый объект при итерации по self.sheets
.
Урок здесь... будьте осторожны при использовании свойств, они ведут себя не так, как переменные.
Более того, остерегайтесь преждевременной оптимизации и не стремитесь к равенству ссылок в качестве вычислительного ярлыка, если у вас нет явной необходимости.
Правда, в данном случае проблема в том, что Worksheet
реализован в другом месте, а __eq__
у него нет. В итоге я сравнил свойство id
объекта, которое работает для этого варианта использования.
да, похоже, у вас там два разных объекта. мы можем только догадываться, почему вы ожидали, что они будут одним и тем же объектом. как правило, использование
is
здесь не подходит. другими словами, похоже, чтоis
работает нормально, почему вы ожидаете, что он будет вести себя иначе?