Python语言如何知道标识符的类型?

时间:2014-09-03 07:40:51

标签: python programming-languages

我最近遇到了这个问题..

How does python identifies the type of an identifier?

例如

a=5
b=6
c=a+b

c的值是11

在哪里

x="hello"
y="world"
z=x+y

z的值是“helloworld”

Python如何区分这两种情况?

3 个答案:

答案 0 :(得分:1)

在Python中,类型不与变量名相关联,而是与值相关联。名称'a'不包含任何类型信息,它是保存该信息的值'1'(即它是'int'类)。

这是与C和Java的契约,其中类型与变量名称相关联。

这正是咖喱式打字系统和教堂式系统之间的区别。

http://en.wikipedia.org/wiki/Simply_typed_lambda_calculus#Intrinsic_vs._extrinsic_interpretations

C和Java使用Church类型(变量名称有类型),而Python和JavaScript使用Curry类型(值有类型)。

答案 1 :(得分:0)

检查__add__方法的类。

真正发生的是调用对象的__add__方法:

a + b确实是a.__add__(b)

同时检查diveintopython是否有特殊方法名称。

来自doc

  

int类型实现numbers.Integral抽象基类。

同样,字符串是str类的实例。

答案 2 :(得分:0)

python解释器识别 identifier 的类型。而是,它标识标识符引用的对象的类型。您声明的标识符或名称不是持有对象,而是 refer 引用这些对象,并且如前面的答案所指出的,这些对象保存有关其自身的类型信息。这些python对象在C语言中以PyObject结构的形式实现,该结构具有指向其类型(也为PyObject *ob_type)的字段PyObject

在上面的背景下,现在是python运行脚本时发生的事情。

  1. i = 1:它为1类型的数字int创建一个对象。
  2. 名称i绑定到刚刚创建的int对象。 “绑定到”是指将条目插入全局词典(您可以通过globals()看到它)。
  3. 按照@ valjeanval42的解释,无论您对i进行的任何操作都会转发到它所引用的对象(当前为int(1))。

由于对象总是知道它们的类型,而对象是它们支持的操作的主要信息来源,因此python可以正确处理i变量,而不是将其分配给1还是{{1 }}(是'1')。

像您期望的那样,诸如C ++或Java之类的静态语言与诸如python之类的动态语言的行为有很大不同。简而言之,它们在编译时管理类型问题,而python在运行时进行管理。