Почему идентификатор (строка) не возвращает адрес строки - PullRequest
2 голосов
/ 02 июля 2010
import ctypes

a = 'abc'
b = ctypes.string_at(id(a), 3)
c = ctypes.string_at(id(a) + 20, 3)

Я ожидаю, что результатом b будет 'abc', но это не так; и результатом c является 'abc'. Я не знаю почему. Кто-нибудь может мне объяснить?

1 Ответ

6 голосов
/ 02 июля 2010

В Python str - это объект, поэтому нет гарантии, как он будет выглядеть в памяти. Возможно, он содержит больше информации, например, длину строки. В вашем случае размер этих «метаданных» составляет, по-видимому, 20 байт.

Возможно, сам объект даже не содержит фактическую строку, а скорее указатель на нее. Если это так, то в вашей ситуации фактическая строка оказывается расположенной через 20 байт после объекта.

В любом случае, это деталь реализации. Ни в одном серьезном коде нельзя полагаться на такое поведение.

...