два разных строковых объекта с одинаковым значением в python - PullRequest
1 голос
/ 27 февраля 2020

Позвольте мне иметь строковый объект a="ABC". Теперь я хочу создать другой объект b="ABC", в котором id(a) и id(b) разделены. Возможно ли это в python?

Ответы [ 3 ]

2 голосов
/ 27 февраля 2020

Это деталь реализации. Если две переменные ссылаются на один и тот же объект (a is b - истина), то они должны быть равны (a == b - истина). Но, по крайней мере, для неизменяемых объектов, Python не указывает, что он делает.

Стандартная реализация CPython использует общие идентификаторы для маленьких целых чисел:

a = 1
b = 1
a is b   # True

Обоснование заключается в том, что они, вероятно, будут использоваться во многих местах в одной и той же программе, а совместное использование общей переменной экономит некоторую память.

Это делается также для строк, , когда интерпретатор может легко догадаться, что они будут разделяют то же значение . Пример для Python 3.6

a = "abc"
b = 'ab' + 'c'
c = ''.join((chr(i) for i in range(65, 68)))
a is b      # gives True
a is c      # gives False

TL / DR: если две равные строки имеют один и тот же идентификатор, является подробностью реализации и на них не следует полагаться.

1 голос
/ 27 февраля 2020

Этот является отличным источником для идентификатора строк:

>>> a = 'python'
>>> id(a)
4400931648
>>> b = a.encode().decode()
>>> b
'python'
>>> id(b)
4400931984
>>> print('Eureka!')
Eureka!

или:

>>> a = 'python'
>>> b = (a + '.')[:-1]
>>> id(a)
4400931648
>>> id(b)
4400931760
>>> print('Eureka!')
Eureka!

Но общий вывод заключается в том, что вы не должны использовать это даже если это возможно.

0 голосов
/ 27 февраля 2020

Python id () возвращает целое число, которое действует как идентификатор этого объекта.

Чтобы ответить на вопрос вкратце:

Попробуйте создать строку "AB C" с помощью нарезка.

>>> a = "ABC"
>>> id(a)
4427474416
>>> b = "ABC"
>>> id(b)
4427474416
>>> b = a[:2]+a[2:]
>>> b
'ABC'
>>> id(b)
4429072688

Для подробного объяснения

Python 3.7

>>> a = 5
>>> id(a) 
4425034672
>>> b = 5
>>> id(b)
4425034672

На самом деле в python неизменных объектов ( Строки, целые числа, кортежи) хранятся в кэше, и он возвращает свое местоположение, когда мы вызвали функцию id ().

Таким образом, он возвращает тот же идентификатор для неизменяемых объектов, что и в большинстве случаев, когда они кэшируются в python как выше.

Для тех же изменяемых объектов id () возвращает разные значения.

Рассмотрим этот пример:

>>> d = { 'a' : 1 }
>>> id(d)
4426697136
>>> p = { 'a' : 1 }
>>> id(p)
4427492000

Примечание:

Он может не возвращать одинаковые значения идентификаторов для тех же неизменных объектов, которые они могут / не могут кэшировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...