python是如何从静态类型语言实现无类型变量的

python是如何从静态类型语言实现无类型变量的,python,c,Python,C,我知道大多数python都是用C实现的。我想知道python是如何工作的(就其在C中的实现而言),当涉及到确定它是什么类型的变量时,在这种情况下,让我们说x=5现在,如果检查x的类型,它会说class int,但在C中是如何实现的? 在引擎盖下进行什么检查以确定它属于int类这是一个巨大的课题 下面的文档将使您更加了解 就像你说的整数类型的一个简单例子 要保存整型对象,C中定义了如下结构 typedef struct { PyObject_HEAD long ob_ival; } PyIntO

我知道大多数python都是用C实现的。我想知道python是如何工作的(就其在C中的实现而言),当涉及到确定它是什么类型的变量时,在这种情况下,让我们说
x=5
现在,如果检查x的类型,它会说class int,但在C中是如何实现的?
在引擎盖下进行什么检查以确定它属于int类这是一个巨大的课题

下面的文档将使您更加了解

就像你说的整数类型的一个简单例子

要保存整型对象,C中定义了如下结构

typedef struct {
PyObject_HEAD
long ob_ival;
} PyIntObject;
C结构的对象
PyIntObject
(上述文档的第7.5节)包含整数类型的对象

如果您更感兴趣,请按照上述文档的第7.5节所述设置环境并进行调试

对象/intobject.c,并在第89行上放置一个调试点。开始 调试应用程序

PyTypeObject对于要表示的类型处于更高级别。(参见上述文件第7.3节)

作为一名程序员,了解其内部结构是一件很奇怪的事情。但是,除非您在解释器级别工作,否则不要花太多时间去理解它。

Python绝不是“无类型的”(请参阅“”)。所有Python对象都有一个特定的类型,它决定了它们的许多属性和行为。对于那些表示为文字的文本,其类型由其词汇形式决定。对于其他对象,这取决于它们的计算方式

Python没有类型声明或任何其他内置形式的限制或预先确定变量或聚合可能包含的对象类型。因此,谈论变量的类型(例如
x
)是没有意义的,而只谈论它所包含的值的类型。这就是
type()
函数(例如)计算的内容。所以当你问

在确定变量类型时,python是如何工作的(就其在C中的实现而言)

答案在某种意义上很简单:Python根本不这么做。变量没有类型——只有它们的值有类型。例如,当您调用
type(x)
时,您不是在确定变量的类型,而是在确定其当前值的类型


Python通过确保每个Python对象(比如由literal
5
表示的对象)都包含相当多的数据来支持这一点。值得注意的是,它包含有关对象的值和类型的信息,但也包含各种其他详细信息,如引用计数等。细节太宽泛了,无法给出一个简单的答案,但你可以在。对于最深刻和最隐秘的秘密,您可能希望研究cpython头和源代码。

我远不是编译器/解释器构造方面的专家,但是C中的void指针可以指向任何类型的数据,因此我认为动态类型的Python没有明显的问题。虽然它可能比“Python中的X行变成C中的Y行”更复杂,“我知道大多数Python是用C实现的”——这是错误的。大多数Python实现都不使用C。IronPython使用C#,Jython使用Java,PyPy使用RPython。@JörgWMittag OP显然是指参考实现CPython,大多数人在谈到Python时都是指CPython,顾名思义,它是用C实现的。您可能想看看我的一个最上乘的答案: