Что определяет идентификатор (адрес памяти) None и может ли он измениться? [Дубликат]

Использование функции reshape:

reshape(dat1, idvar = "name", timevar = "numbers", direction = "wide")
11
задан Charles 7 October 2011 в 04:23
поделиться

3 ответа

Он является на основе None id, но None является одним из нескольких объектов Python, которые определены как глобальные переменные C, поэтому его адрес (обычно) не изменяется между прогонами Python. Другие такие объекты: True и False (но они хэшированы как int) или встроенные классы, такие как object и tuple.

Адрес (и хэш) отличается от однако, разные сборки CPython. В моей системе hash(None) выдает 539708.

11
ответ дан Petr Viktorin 22 August 2018 в 19:49
поделиться
  • 1
    Излишне говорить, что это деталь реализации CPython, поэтому вы не должны полагаться на нее. – Petr Viktorin 7 October 2011 в 01:30
  • 2
    Просто из любопытства, как мог полагаться на него? – Jason Baker 7 October 2011 в 19:08
  • 3
    @ChrisW., Нет, это не было бы проблемой, так как hash () этого объекта все равно останется таким же, пока объект живет (так как вы не можете перемещать живые объекты в разные сеансы Python). – Petr Viktorin 19 September 2012 в 09:51
  • 4
    @ChrisW. Да. Это также произойдет, например, True или любой объект, который не отменяет __hash__. И с PYTHONHASHSEED установите для random (рекомендуется для веб-серверов) для строк. – Petr Viktorin 20 September 2012 в 08:20
  • 5
    Обратите внимание, что адрес может меняться между прогонами одного и того же двоичного кода python, если в вашей операционной системе включена рандомизация адресного пространства. – nos 1 July 2015 в 22:06

Поскольку None является объектом, я написал функцию object_hash для вычисления хеша объекта:

import sys
import struct

def int_overflow(value):
    """ simulate integer overflow """
    m = sys.maxint + 1
    return (value + m) % (m * 2) - m

def object_hash(value):
    res = id(value)
    sizeof_void_p = struct.calcsize('P')
    res = int_overflow((res >> 4) | (res << (8 * sizeof_void_p - 4)))
    if res == -1:
        res = -2
    return res

Полученные хэши равны:

>>> hash(None)
492116
>>> object_hash(None)
492116L
2
ответ дан Delimitry 22 August 2018 в 19:49
поделиться

Он основан на адресе None в памяти , как указывает определение типа .

8
ответ дан Ignacio Vazquez-Abrams 22 August 2018 в 19:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: