Подтвердить что ты не робот

Integer литерал является объектом в Python?

Возможный дубликат:
доступ к методам литералов int python

Все в Python - это объект. Даже число - это объект:

>>> a=1
>>> type(a)
<class 'int'>
>>>a.real
1

Я попробовал следующее, потому что мы должны иметь доступ к членам класса объекта:

>>> type(1)
<class 'int'>
>>> 1.real
  File "<stdin>", line 1
    1.real
         ^
SyntaxError: invalid syntax

Почему это не работает?

4b9b3361

Ответ 1

Да, целочисленный литерал - это объект в Python. Подводя итог, анализатор должен уметь понимать, что он имеет дело с объектом типа integer, в то время как оператор 1.real смешивает анализатор с мыслью, что он имеет float 1., за которым следует слово real, и, следовательно, повышает синтаксическая ошибка.

Чтобы проверить это, вы также можете попробовать

>> (1).real
  1

а также

>> 1.0.real
  1.0

поэтому в случае 1.real python интерпретирует . как десятичную точку.

Edit

BasicWolf также делает это красиво - 1. интерпретируется как представление с плавающей запятой 1, поэтому 1.real эквивалентно записи (1.)real - поэтому без оператора доступа к атрибуту, т.е. периода/полной остановки. Отсюда и синтаксическая ошибка.

Дальнейшее редактирование

Как отмечает в своем комментарии mgilson: синтаксический анализатор может обрабатывать доступ к атрибутам и методам int, но только до тех пор, пока оператор не дает понять, что ему дается int, а не float.

Ответ 2

Хотя поведение с 1.real кажется нелогичным, ожидается из-за спецификации языка: Python интерпретирует 1. как float (см. литеры с плавающей запятой ). Но поскольку @mutzmatron указал, что (1).real работает, потому что выражение в скобках является допустимым объектом Python.

Обновление: обратите внимание на следующие ямы:

1 + 2j.real
>>> 1.0      # due to the fact that 2j.real == 0
# but
1 + 2j.imag  
>>> 3.0      # due to the fact that 2j.imag == 2

Ответ 3

язык обычно строится в трех слоях.

когда вы предоставляете программу на язык, который сначала должен "читать" программу. то он строит то, что он прочитал, во что он может работать. и, наконец, он запускает эту вещь как "программа" и (надеюсь) печатает результат.

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

1.234

и

1.letters

то, что, похоже, происходит, состоит в том, что он думает, что вы пытались ввести число, подобное 1.234, но совершило ошибку и набрало буквы вместо (!).

так что это не имеет никакого отношения к тому, что 1 "действительно есть" и является ли он объектом. вся эта логика происходит на втором и третьем этапах, которые я описал ранее, когда python пытается построить, а затем запустить программу.

то, что вы обнаружили, - это просто странная (но интересная!) морщина в том, как питон читает программы.

[Я бы назвал это ошибкой, но, вероятно, это по какой-то причине. выясняется, что некоторые компьютеры трудно читать. python, вероятно, спроектирован так, что легко (быстро) для компьютера читать программы. исправление этой "ошибки", вероятно, сделало бы часть python, которая будет читать программы медленнее или сложнее. так что это, вероятно, компромисс.]

Ответ 4

Вы можете получить доступ к 1.real:

>>> hasattr(1, 'real')
True
>>> getattr(1, 'real')
1