可能重复:
访问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似乎不合逻辑,但由于语言规范的原因,预计会出现这种情况: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)
语言通常分为三层.
当您为某种语言提供程序时,它首先必须"读取"该程序.然后它将它所读取的内容构建为可以使用的内容.最后它将那个东西作为"程序"运行,并且(希望)打印出一个结果.
这里的问题是python的第一部分 - 读取程序的部分 - 是混淆的.它很困惑,因为它不够聪明,不知道它们之间的区别
1.234
Run Code Online (Sandbox Code Playgroud)
和
1.letters
Run Code Online (Sandbox Code Playgroud)
似乎正在发生的事情是,它认为你试图键入一个类似的数字,1.234但却犯了一个错误并输入了字母(!).
所以这与1"真正的" 无关,无论它是否是一个对象.所有这种逻辑都发生在前面描述的第二和第三阶段,当python尝试构建然后运行程序时.
你发现的只是一个奇怪的(但有趣的!)蟒蛇读取程序的皱纹.
[我称之为一个错误,但它可能是这样的原因.事实证明,有些东西很难让电脑阅读.python可能是为了让计算机轻松(快速)读取程序而设计的.修复这个"bug"可能会使python的一部分读取程序更慢或更复杂.所以这可能是一种权衡.]