Python Нет сравнения с ключевым словом - PullRequest
1 голос
/ 27 марта 2020

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

Этот фрагмент

number = None
if number is None:
    print("PEP 8 Style Guide prefers this pattern")

Выходы

>>PEP 8 Style Guide prefers this pattern

Означает ли это, когда я назначаю number = None, тогда это только ссылка, потому что is проверяет, является ли это тем же объектом. Я так растерялся, почему это происходит ?? Я ошибаюсь?? Почему был сделан этот дизайн?

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Это по двум причинам.

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

.

Примечание. Свойство уникальности также удовлетворяется другими литералами, особенно небольшими, из соображений производительности .

2 голосов
/ 27 марта 2020

Все назначения приведены по ссылке (см. Факты и мифы о Python именах и значениях ). Тем не менее, язык гарантирует, что None является единственным объектом своего типа. Это значение создается при запуске, и литерал None будет всегда создавать ссылку на это значение.

>>> a = None;  b = None
>>> a is b
True
>>> a = None
>>> b = None
>>> a is b
True

Сравните с литералом, таким как 12345, который может или может не создавать ссылку на существующее значение типа int.

>>> a = 12345; b = 12345
>>> a is b
True
>>> a = 12345
>>> b = 12345
>>> a is b
False

Почему это приводит к другим результатам, на самом деле не важно, кроме как сказать, что реализация может создавать новые объекты из литералов int, если предпочитает.

...