Это по двум причинам.
1. Назначения в Python приведены по ссылке.
В следующем коде
x = object()
y = x
print(x is y) # True
print(id(x)) # 139957673835552
print(id(y)) # 139957673835552
Вызов object()
создает в памяти новую структуру, уникальный идентификатор которой можно получить с помощью id()
функция. Вы можете представить, что x
и y
являются стрелками, указывающими на один и тот же объект, и поэтому их базовый идентификатор одинаков в обоих случаях.
Таким образом, при присвоении None
переменной, вы просто говорите: «number
- это псевдоним, стрелка, указывающая на объект, возвращаемый , пишущим None
». Вы можете проверить, что
number = None
print(id(None), id(number))
даст вам один и тот же идентификатор два раза. Но ждать! Что если вы сделаете это для большого числа, например 100000
?
number = 100000
print(id(100000), id(number)) # Different values!
Это означает, что один и тот же литерал, написанный два раза, может возвращать разные объекты, вызывая следующую причину.
2. Языковая гарантия для None
Обратите внимание, что независимо от того, сколько раз вы получаете идентификатор None
, вы получаете один и тот же.
print(id(None)) # 139957682420224
print(id(None)) # 139957682420224
print(id(None)) # 139957682420224
Это потому, что написание None
не делает t создать новый объект, как в первом примере, потому что спецификация языка гарантирует , что в памяти есть только один возможный объект NoneType
. Другими словами, есть только один возможный объект, возвращаемый записью None
, поэтому сравнение с is
работает как положено. Это хороший выбор дизайна: есть только один канонический способ сказать, что переменная ( стрелка ) указывает на ничто .
В На самом деле, использование is
рекомендуется как способ проверки * Pythoni c, что переменная None
.
. Вы также можете получить класс объекта, написав
NoneType = type(None)
и обратите внимание на истинность
NoneType() is None
.
Примечание. Свойство уникальности также удовлетворяется другими литералами, особенно небольшими, из соображений производительности .