2013-11-06 3 views
1

У меня возникли проблемы с сравнением сложных объектов в Python, в тех случаях, когда кто-то делает, эффективно object_a = object_b, а затем if object_a == object_b:. Моим обычным решением было сделать адрес объекта в строку, которая всегда должна быть уникальной.Уверенный огонь, простой способ сравнить два сложных объекта в Python?

Ниже приведен пример, в котором он работает в обоих направлениях, сравнивая объекты и сравнивая значения str(object_a) и str(object_b).

>>> class Thing: 
>>>  def __init__(self): 
>>>   self.x = 0 
>>>   return 
>>> 
>>> a = Thing() 
>>> b = a 
>>> b == a 
True 
>>> a_pointer = str(a) 
>>> b_pointer = str(b) 
>>> a 
<__main__.Thing instance at 0x16c0098> 
>>> b 
<__main__.Thing instance at 0x16c0098> 
>>> a == b 
True 

Есть ли лучший способ? Есть ли случай, когда это может не сработать?

+0

Не могли бы вы рассказать о том, что проблема, давая пример вывода, который не то, что вы ожидали? –

ответ

1

Простой безошибочный способ проверки на равенство ==:

a == b 

Простой надежный способ проверить, если они имеют одинаковую идентичность is:

a is b 

Второй способ (is) выполняет ту же проверку, что и вы для выполнения str(a)==str(b).

1

С помощью кода вы не сравниваете два объекта быстрее, а просто спрашиваете, являются ли ваши переменные , что указывает на тот же объект, что совсем по-другому.

Во всяком случае, вещий способ сделать это не кастинг указатели на строки, но с использованием оператора «является»:

>>> a is b 
True 
>>> b is A 
True 
+0

Спасибо, @dbra. Это то, что я собирался. По причинам, которые не интересны, я застрял с разными кортежами, указывающими на один и тот же объект в dict, и мне нужно проверить это в коде. Я не мог воспроизвести свою проблему, поэтому я просто избегал ее с помощью теста str (a) == str (b). Интересные [причуды «есть»] (http://www.reddit.com/r/Python/comments/1e8xw5/common_misconceptions_in_python/) – Moondoggy

Смежные вопросы