Integer literal是Python中的一个对象?

use*_*873 14 python syntax

可能重复:
访问python int literals方法

Python中的所有东西都是一个对象.甚至一个数字也是一个对象:

>>> a=1
>>> type(a)
<class 'int'>
>>>a.real
1
Run Code Online (Sandbox Code Playgroud)

我尝试了以下内容,因为我们应该能够访问对象的类成员:

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

为什么这不起作用?

jme*_*etz 19

是的,整数文字 Python中的一个对象.总而言之,解析器需要能够理解它正在处理integer类型的对象,而语句1.real会将解析器混淆为认为它有一个1.后跟单词的float real,因此会引发语法错误.

要测试这个你也可以尝试

>> (1).real
  1
Run Code Online (Sandbox Code Playgroud)

以及,

>> 1.0.real
  1.0
Run Code Online (Sandbox Code Playgroud)

所以在1.realpython 的情况下解释.为小数点.

编辑

BasicWolf也很好 - 1.它被解释为1的浮点表示,所以1.real相当于写(1.)real- 所以没有属性访问运算符,即句点/句号.因此语法错误.

进一步编辑

正如mgilson在他/她的评论中提到的那样:解析器可以处理对int属性和方法的访问,但只要声明清楚地表明它被赋予了一个int而不是一个float.

  • `1 .real`也可以工作(浮点数为1..real`). (14认同)
  • 原因是当Python看到一些数字然后是一个句点时,它会将它视为小数点,并期望它是一个浮点数.ETA:对,你得出了同样的结论 (6认同)

Zau*_*bov 7

尽管行为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
Run Code Online (Sandbox Code Playgroud)


and*_*oke 7

语言通常分为三层.

当您为某种语言提供程序时,它首先必须"读取"该程序.然后它将它所读取的内容构建为可以使用的内容.最后它将那个东西作为"程序"运行,并且(希望)打印出一个结果.

这里的问题是python的第一部分 - 读取程序的部分 - 是混淆的.它很困惑,因为它不够聪明,不知道它们之间的区别

1.234
Run Code Online (Sandbox Code Playgroud)

1.letters
Run Code Online (Sandbox Code Playgroud)

似乎正在发生的事情是,它认为你试图键入一个类似的数字,1.234但却犯了一个错误并输入了字母(!).

所以这与1"真正的" 无关,无论它是否是一个对象.所有这种逻辑都发生在前面描述的第二和第三阶段,当python尝试构建然后运行程序时.

你发现的只是一个奇怪的(但有趣的!)蟒蛇读取程序的皱纹.

[我称之为一个错误,但它可能是这样的原因.事实证明,有些东西很难让电脑阅读.python可能是为了让计算机轻松(快速)读取程序而设计的.修复这个"bug"可能会使python的一部分读取程序更慢或更复杂.所以这可能是一种权衡.]