Загадка foo bar с ответом

>>> s = 'foo'
>>>…
>>> {s: 1, 'bar': 2}
{'bar': 1, 'bar': 2}

Что в пропущенной строчке?

ЗЫ: никакие built-in функции или объект строки заменять нельзя. Ответ под катом.

Ответ

>>>s = 'foo'
>>>(ctypes.c_char * sys.getsizeof(s)).from_address(id(s))[-4:-1] = 'bar'
>>>{s: 1, 'bar': 2}
{'bar': 1, 'bar': 2}

Обыкновенная черная магия. И да, строки в питоне это неизменяемый тип. Но, шутки ради, их можно и поизменять. И кстати, хеш строки хранится отдельно от значения. Поэтому в словаре она занимает отдельное место 🙂

PS: Пока не понял до конца принцип, но если имя переменной строки совпадает с ее содержимым, то при попытке перезаписать значение происходят всякие странные штуки. Например переменная строки может исчезнуть. Или модуль. Или интерпретатор просто возьмет и закроется- без креша, с кодом 0, тихо и спокойно.

Запись опубликована в рубрике Разное с метками . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *