Python类型转换/转换语法差异

Python类型转换/转换语法差异,python,Python,我想知道以下两段代码之间的区别是什么: float_var = 1234.5678 a = int(float_var) b = (int)(float_var) 它们都成功地将变量转换为整数(至少在Python3.6中,我不知道2.7是否支持这种行为),但在语法上有明显的区别。此外,以下代码段失败: c = (int)float_var 这让我相信变量名(或文字,可能是)必须用括号括起来 从我所能收集到的两个示例中的差异是,第一个示例通过将参数传递到其_init__方法来创建一个类的新实例

我想知道以下两段代码之间的区别是什么:

float_var = 1234.5678
a = int(float_var)
b = (int)(float_var)
它们都成功地将变量转换为整数(至少在Python3.6中,我不知道2.7是否支持这种行为),但在语法上有明显的区别。此外,以下代码段失败:

c = (int)float_var
这让我相信变量名(或文字,可能是)必须用括号括起来

从我所能收集到的两个示例中的差异是,第一个示例通过将参数传递到其_init__方法来创建一个类的新实例。而在第二个示例中,由于int对象定义了一个方法_float _;,因此它可以将任何float“强制转换”到int的实例


我这样想对吗?还有,为什么第三个例子失败了?我不明白为什么要用括号括住“cast”的值。

a和b之间没有区别。说他们不同就像说
2
(2)
是不同的。第三个示例失败,因为没有括号无法调用函数。例如,
int 5
将不起作用,因为参数周围没有括号。

没有区别

Python类型是对象,可以像函数一样调用。Python和C可能共享
int(foo)
语法,但相似之处到此为止

在您的代码中,
int==(int)=((int))
以相同的方式都是相等的
1+1==(1+1)=((1+1))
。如果查看字节码,Python对这两种代码的处理是相同的:

In [42]: dis.dis(lambda: (int)(a))
  1           0 LOAD_GLOBAL              0 (int)
              3 LOAD_GLOBAL              1 (a)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE

In [43]: dis.dis(lambda: int(a))
  1           0 LOAD_GLOBAL              0 (int)
              3 LOAD_GLOBAL              1 (a)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE
第三个示例失败,因为Python不是C。您会得到一个
SyntaxError
,因为它不是有效的Python代码

我这样想对吗

不,括号把你甩了。这两种方法是等价的。这:

(int)(float_var)
与此相同:

int(float_var)
这不是什么特殊的“铸造”语法。它只是一个名字的括号

解析器为每个方法返回等效的抽象语法树:

>>> import ast
>>> ast.dump(ast.parse('(int)(float_var)'))
"Module(body=[Expr(value=Call(func=Name(id='int', ctx=Load()), args=[Name(id='float_var', ctx=Load())], keywords=[]))])"
>>> ast.dump(ast.parse('int(float_var)'))
"Module(body=[Expr(value=Call(func=Name(id='int', ctx=Load()), args=[Name(id='float_var', ctx=Load())], keywords=[]))])"

但是,Python语法不允许使用第三种方法。如上所述,名称周围的括号没有什么特别之处。无论哪种方式,它都被转换为函数调用。因此,虽然
int
周围的括号是可选的,但末尾的括号不是。

还有,第二个例子没有第一个例子广泛使用的原因吗?我的猜测是它没有那么清楚,但我不确定。
a
b
是相同的。很可能
int
周围的括号什么都不做。您可以使用
dis
模块查看结果字节码,它将是相同的。
>>> import ast
>>> ast.dump(ast.parse('(int)(float_var)'))
"Module(body=[Expr(value=Call(func=Name(id='int', ctx=Load()), args=[Name(id='float_var', ctx=Load())], keywords=[]))])"
>>> ast.dump(ast.parse('int(float_var)'))
"Module(body=[Expr(value=Call(func=Name(id='int', ctx=Load()), args=[Name(id='float_var', ctx=Load())], keywords=[]))])"