整型字面值是Python中的一个对象吗?

14

可能是重复问题:
如何访问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

为什么这个不起作用?


4
这是语法错误。编译器无法理解语法。编程语言的语法(也就是它的语法规则)不允许你在整数后面输入方法名。这不是程序运行时的错误,而是在程序运行之前就出现了。解析器无法理解你输入的内容。 - andrew cooke
@andrewcooke -- 我认为问题(顺便演示得很好)是:为什么分析器无法处理这个?您可以访问其他类型的文字字面量上的属性/方法(考虑常见的"".join(...),为什么不能是整数? - mgilson
确实如此,但我认为提问者最担心的是整数不是对象(请参见同一用户的http://stackoverflow.com/questions/11801549/python-data-types-are-classes-or-data-structures)。因此,我强调这是来自一个单独的、早期的层。 - andrew cooke
4个回答

19

是的,在Python中,整数字面值是一个对象。简而言之,解析器需要能够理解它正在处理类型为整数的对象,而语句1.real会让解析器混淆,以为它有一个浮点数1.后跟单词real,因此会引发语法错误。

您还可以尝试进行测试。

>> (1).real
  1

以及,

>> 1.0.real
  1.0

因此,在1.real的情况下,Python将.解释为小数点。

编辑

BasicWolf也很好地阐述了这一点 - 1.被解释为1的浮点表示,因此1.real等效于写作(1.)real - 因此没有属性访问运算符,即句号/句点。因此出现语法错误。

进一步编辑

正如mgilson在他/她的评论中所暗示的那样:解析器可以处理对int的属性和方法的访问,但前提是语句清楚地表明它正在给定一个int而不是一个float


14
"1.real"也可用(对于浮点数可以使用"1..real")。 - Josh Lee
6
原因是当Python看到一些数字后跟一个句点时,它会将其视为小数点并期望它是浮点数。ETA:对,你得出了同样的结论。 - David Robinson
1
+1,但您可能需要为令人困惑的标题添加一个清晰的答案:是的,整数字面量是一个对象;这不是1.real失败的原因。 - abarnert
@abarnert:干杯,已包含编辑。 - jmetz
@JoshLee 实际上它能够正常工作本身就是不可思议的,尤其是对于一个习惯于不同编程语言的开发者来说。 - Galaxy

7
尽管使用1.real的行为似乎不合逻辑,但由于语言规范,这是可以预期的:Python将1.解释为浮点数(参见浮点数字面量)。但正如@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

1 + 2j.real 只是偶然起作用,它等同于 1 + (2j.real),其总是等于 1 + 0 - Lauritz V. Thaulow
谢谢您夸奖@lazyr! - Zaur Nasibov

7
一个语言通常由三层构建。
当您提供程序给语言时,它首先要“读取”程序。然后,它将读取的内容构建成可以处理的东西。最后,它作为“程序”运行那个东西,并(希望)打印结果。
问题在于 Python 的第一部分 - 读取程序的部分 - 很困惑。它之所以困惑,是因为它不够聪明,无法区分

1.234

并且
1.letters

似乎发生的情况是,它认为您试图输入类似于1.234这样的数字,但错误地输入了字母!因此,这与1“真正是什么”以及它是否是一个对象无关。所有这种逻辑都发生在我之前描述的第二个和第三个阶段,当Python尝试构建并运行程序时。
您发现的只是Python读取程序中的奇怪(但有趣!)细节。我会称其为一个bug,但它可能出于某种原因而是这样的。事实证明,有些东西对计算机很难读取。Python可能被设计成让计算机轻松(快速)读取程序。修复这个“bug”可能会使读取程序的Python部分变得更慢或更复杂。因此,这可能是一种权衡。

+1,并提供维基百科关于“词法分析”的文章链接,这是常见的第一步骤。 - Izkata

3
您仍然可以访问1.real:
>>> hasattr(1, 'real')
True
>>> getattr(1, 'real')
1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接