Я полностью застрял в этом
>>> s = chr(8263)
>>> x = s[0]
>>> x is s[0]
False
Как это возможно? Означает ли это, что доступ к строковому символу путем индексирования создает новый экземпляр того же символа? Пусть эксперимент:
>>> L = [s[0] for _ in range(1000)]
>>> len(set(L))
1
>>> ids = map(id, L)
>>> len(set(ids))
1000
>>>
Похоже на то, что пустая трата байтов;) Или это означает, что str.__getitem__
имеет скрытую функцию? Может кто-нибудь объяснить?
Но это не конец моего удивления:
>>> s = chr(8263)
>>> t = s
>>> print(t is s, id(t) == id(s))
True True
Это ясно: t
является псевдонимом для s
, поэтому они представляют один и тот же объект и идентичности совпадают. Но опять же, как возможно следующее:
>>> print(t[0] is s[0])
False
s
и t
- это тот же объект, что?
Но хуже:
>>> print(id(t[0]) == id(s[0]))
True
t[0]
и s[0]
не были собраны мусором, считаются одним и тем же объектом оператором is
, но имеют разные идентификаторы? Может кто-нибудь объяснить?