Недавно я обнаружил потенциальную ошибку в производственной системе, где две строки сравнивались с помощью оператора идентичности, например:сравнение строк идентичность в CPython
if val[2] is not 's':
я представляю это, однако, будет часто работать в любом случае, потому что, как далеко поскольку я знаю, что CPython хранит короткие неизменяемые строки в одном месте. Я заменил его !=
, но мне нужно подтвердить, что данные, которые ранее прошли через этот код, верны, поэтому я хотел бы знать, всегда ли это работает, или если это только иногда срабатывает.
Версия Python всегда была 2.6.6, насколько я знаю, и приведенный выше код кажется единственным местом, где использовался оператор is
.
Кто-нибудь знает, будет ли эта линия всегда Работаете ли программисты?
редактировать: Потому что это, без сомнения, очень специфично и бесполезная для будущих читателей, я задам другой вопрос:
Где я должен смотреть, чтобы подтвердить с полной уверенностью поведения реализации Python? Легко ли переварить оптимизацию в исходном коде CPython? Какие-нибудь советы?
См. Http://stackoverflow.com/questions/2858603/python-why-is-keyword-has-different-behavior-when-there-is-dot-in-the-string/2858680#2858680 для Alex Martelli's погрузиться в детали реализации. Короткий ответ, конечно, «Нет, нет гарантии, что это будет последовательным». С практической точки зрения, вполне вероятно, что с таким коротким строковым литералом, что автоматическое интернирование будет работать, как вы ожидаете. Тем не менее, у меня есть некоторые сомнения в строках, построенных в C-расширениях - они могут не подвергаться тем же самым эвристикам интернирования. –
Так как даже 'chr (115) - это' s'' работает, для которого поиск строки больше влияет на производительность, чем на все, я бы предположил, что поиск происходит автоматически ниже определенной длины. –
Почему бы вам просто не исправить ошибку и не опрокинуть ее? –