Да, это безопасно. Это работает, потому что вы буквально сравниваете базовое представление этих объектов (как AST), и они никогда не будут равны в этом смысле, если у вас разные имена.
Но я должен сказать, что это довольно неортодоксально. Чтобы проиллюстрировать это, рассмотрим следующее:
from z3 import *
a = Int('a')
b = Int('b')
solver = Solver()
solver.add(a == b)
s = set()
s.add(a)
s.add(b)
print(s)
, это напечатает {b, a}
, хотя мы явно утверждали, что a
и b
абсолютно одинаковы для решателя. Это может привести к путанице в будущем.
Конечно, это вполне может быть именно то, что вы пытаетесь сделать. То есть разделить переменные синтаксически, независимо от их значения. Я могу видеть некоторые варианты использования для этого, если вы выполняете программирование на «мета» уровне z3, то есть создаете библиотеки поверх него, но в целом вам следует избегать любых действий, которые проверяют идентичность таких объектов в z3py. Это может привести к путанице, если вы начнете смешивать идентичность объекта и идентичность значения. Обычно в программировании Symboli c требуется значение-тождество, но опять же, это зависит от вашего варианта использования.