Вы также можете использовать lambda
. Полезно, если вы используете django.utils.timezone.now
date = models.DateField(_("Date"), default=lambda: now().date())
Смотрите на это:
>>> 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 в этом случае не определено.:-)
Я думаю, что Ваши гипотезы корректны. Эксперимент с 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
рассматривают как литералы, и что-либо выше рассматривают по-другому!
Поскольку можно зарегистрироваться исходный файл intobject.c, кэши Python маленькие целые числа для эффективности. Каждый раз, когда Вы создаете ссылку на маленькое целое число, Вы отсылаете кэшируемое маленькое целое число, не новый объект. 257 не маленькое целое число, таким образом, оно вычисляется как различный объект.
лучше использовать ==
с этой целью.
Это зависит от того, надеетесь ли Вы видеть, равны ли 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__
атрибуты.
Для неизменных объектов значения, как ints, строки или datetimes, объектные идентификационные данные не особенно полезны. Лучше думать о равенстве. Идентификационные данные являются по существу деталью реализации для объектов значения - так как они неизменны, нет никакого эффективного различия между наличием нескольких судей к тому же объекту или нескольким объектам.
What’s Новый В Python 3.8: Изменения в поведении Python :
компилятор теперь производит SyntaxWarning, когда установление личности (
is
иis not
) используется с определенными типами литералов (например, строки, ints). Они могут часто работать случайно в CPython, но не гарантируются спецификацией языка. Предупреждение советует пользователям использовать тесты равенства (==
и!=
) вместо этого.