Оператор «is» ведет себя неожиданно с целыми числами

Вы также можете использовать lambda. Полезно, если вы используете django.utils.timezone.now

date = models.DateField(_("Date"), default=lambda: now().date())

463
задан Jim Fasarakis Hilliard 23 January 2016 в 14:11
поделиться

6 ответов

Смотрите на это:

>>> a = 256
>>> b = 256
>>> id(a)
9987148
>>> id(b)
9987148
>>> a = 257
>>> b = 257
>>> id(a)
11662816
>>> id(b)
11662828

РЕДАКТИРОВАНИЕ: вот то, что я нашел в документации Python 2, "Простые Целочисленные Объекты" (Это - то же для Python 3 ):

текущая реализация сохраняет массив целочисленных объектов для всех целых чисел между-5 и 256 при создании интервала в том диапазоне, Вы на самом деле просто возвращаете ссылку на существующий объект. Таким образом, должно быть возможно изменить значение 1. Я подозреваю, что поведение Python в этом случае не определено.:-)

356
ответ дан Ringil 23 January 2016 в 14:11
поделиться
  • 1
    Да, изменение цвета фона строки с tr:hover является способом пойти с этим подходом. – Eric Johnson 20 August 2009 в 10:32

Я думаю, что Ваши гипотезы корректны. Эксперимент с id (идентификационные данные объекта):

In [1]: id(255)
Out[1]: 146349024

In [2]: id(255)
Out[2]: 146349024

In [3]: id(257)
Out[3]: 146802752

In [4]: id(257)
Out[4]: 148993740

In [5]: a=255

In [6]: b=255

In [7]: c=257

In [8]: d=257

In [9]: id(a), id(b), id(c), id(d)
Out[9]: (146349024, 146349024, 146783024, 146804020)

кажется, что числа <= 255 рассматривают как литералы, и что-либо выше рассматривают по-другому!

19
ответ дан Jim Fasarakis Hilliard 23 January 2016 в 14:11
поделиться
  • 1
    Любой шанс Вы могли вскопать больше об этом. I' m борющийся с получением точно, что стратегия работать правильно. – troelskn 28 May 2009 в 09:30

Поскольку можно зарегистрироваться исходный файл intobject.c, кэши Python маленькие целые числа для эффективности. Каждый раз, когда Вы создаете ссылку на маленькое целое число, Вы отсылаете кэшируемое маленькое целое число, не новый объект. 257 не маленькое целое число, таким образом, оно вычисляется как различный объект.

лучше использовать == с этой целью.

36
ответ дан Vallentin 23 January 2016 в 14:11
поделиться

Это зависит от того, надеетесь ли Вы видеть, равны ли 2 вещи, или тот же объект.

is проверки, чтобы видеть, являются ли они тем же объектом, не просто равным. Маленькие ints, вероятно, указывают на ту же ячейку памяти для эффективности пространства

In [29]: a = 3
In [30]: b = 3
In [31]: id(a)
Out[31]: 500729144
In [32]: id(b)
Out[32]: 500729144

, необходимо использовать == для сравнения равенства произвольных объектов. Можно определить поведение с эти __eq__, и __ne__ атрибуты.

56
ответ дан Vallentin 23 January 2016 в 14:11
поделиться
  • 1
    Поскольку строка состояния является anaware того, что onclick собирается сделать, и автор вопроса хотел видеть целевой URL там. – buti-oxa 6 August 2010 в 15:36

Для неизменных объектов значения, как ints, строки или datetimes, объектные идентификационные данные не особенно полезны. Лучше думать о равенстве. Идентификационные данные являются по существу деталью реализации для объектов значения - так как они неизменны, нет никакого эффективного различия между наличием нескольких судей к тому же объекту или нескольким объектам.

12
ответ дан babbageclunk 23 January 2016 в 14:11
поделиться
  • 1
    Это отключено в большинстве браузеров теперь. – Michael Haren 13 October 2008 в 14:18

What’s Новый В Python 3.8: Изменения в поведении Python :

компилятор теперь производит SyntaxWarning, когда установление личности (is и is not) используется с определенными типами литералов (например, строки, ints). Они могут часто работать случайно в CPython, но не гарантируются спецификацией языка. Предупреждение советует пользователям использовать тесты равенства (== и !=) вместо этого.

1
ответ дан 22 November 2019 в 22:49
поделиться
Другие вопросы по тегам:

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