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=[]))])"