Я попытался понять, когда строки Python идентичны (они также используют одно и то же расположение памяти). Однако во время моих тестов, похоже, нет очевидного объяснения, когда две строковые переменные, которые равны, используют одну и ту же память:
import sys
print(sys.version) # 3.4.3
# Example 1
s1 = "Hello"
s2 = "Hello"
print(id(s1) == id(s2)) # True
# Example 2
s1 = "Hello" * 3
s2 = "Hello" * 3
print(id(s1) == id(s2)) # True
# Example 3
i = 3
s1 = "Hello" * i
s2 = "Hello" * i
print(id(s1) == id(s2)) # False
# Example 4
s1 = "HelloHelloHelloHelloHello"
s2 = "HelloHelloHelloHelloHello"
print(id(s1) == id(s2)) # True
# Example 5
s1 = "Hello" * 5
s2 = "Hello" * 5
print(id(s1) == id(s2)) # False
Строки неизменяемы, и, насколько я знаю, Python пытается повторно использовать существующие неизменяемые объекты, имея в виду, что другие переменные указывают на них вместо создания новых объектов в памяти с тем же значением.
Имея это в виду, кажется очевидным, что Example 1
возвращает True
.
По-прежнему очевидно (мне), что Example 2
возвращает True
.
Мне не кажется очевидным, что Example 3
возвращает False
- я не делаю то же, что и в Example 2
?!?
Я наткнулся на этот вопрос SO:
Почему сравнение строк в Python с использованием "==" или "is" иногда приводит к другому результату?
и прочитайте http://guilload.com/python-string-interning/ (хотя я, вероятно, все это не понял), и yougt - хорошо, может быть, "интернированные" строки зависят по длине, поэтому я использовал HelloHelloHelloHelloHello
в Example 4
. Результат был True
.
И то, что меня озадачило, делало то же самое, что и в Example 2
, только с большим числом (но оно фактически возвращало бы ту же строку, что и Example 4
) - однако на этот раз результат был False
?!?
Я действительно не знаю, как Python решает, использовать ли тот же объект памяти или когда создать новый.
Являются ли какие-либо официальные источники, которые могут объяснить это поведение?