Оператор is
сообщает, указывают ли две переменные на один и тот же объект в памяти .Это редко полезно и часто путается с оператором ==
, который сообщает вам, «выглядят ли два объекта одинаково».
Это особенно запутанно, когда используется с такими вещами, как короткие строковые литералы, потому что интерны компилятора Pythonэто для эффективности.Другими словами, когда вы пишете "xx"
, компилятор (испускает байт-код, который) создает один строковый объект в памяти и заставляет все литералы "xx"
указывать на него.Это объясняет, почему ваши первые два сравнения верны.Обратите внимание, что вы можете получить идентификатор строк, вызвав для них id
, который (по крайней мере, для CPython, вероятно) их адрес в памяти:
>>> a = "xx"
>>> b = "xx"
>>> id(a)
38646080
>>> id(b)
38646080
>>> a is b
True
>>> a = "x"*10000
>>> b = "x"*10000
>>> id(a)
38938560
>>> id(b)
38993504
>>> a is b
False
Третье, потому что компилятор не имеетинтернировал строки a
и b
по любой причине (возможно, потому что она недостаточно умна, чтобы заметить, что переменная n
определена один раз, а затем никогда не изменена).
Вы можете фактическизаставить Python интернировать строки, ну, в общем, с запросом .Это даст вам небольшое увеличение производительности и может помочь.Это, вероятно, бесполезно.
Мораль: не используйте is
со строковыми литералами.Или литералы int.Или где-нибудь, на самом деле вы не это имеете в виду.