gpt4 book ai didi

python - Python 解释器如何在动态类型中工作?

转载 作者:太空狗 更新时间:2023-10-29 22:15:15 25 4
gpt4 key购买 nike

我读了这个问题,但没有给我一个明确的答案: How does Python interpreter look for types?

python 解释器如何知道变量的类型?我不是在看如何获得类型。我在这里查看幕后发生的事情。在下面的示例中,它如何将类 int 或 string 关联到我的变量。

它怎么知道那是一个整数:

>>> i = 123
>>> type(i)
<class 'int'>

或者那个字符串:

>>> i = "123"
>>> type(i)
<class 'str'>

最佳答案

how does it associate the class int or string to my variable

Python 没有。 变量没有类型。只有变量引用的对象才有类型。变量只是指向对象的名称

例如,下面也显示了一个对象的类型,但是不涉及变量:

>>> type(1)
<class 'int'>
>>> type('foobar')
<class 'str'>

当您使用 type(variable) 时, variable表达式的一部分只是返回名称引用的对象,将对象传递给type()功能。使用 1 时或 'foobar' ,表达式是生成对象的文字,然后传递给 type()功能。

Python 对象只是解释器内存中的数据结构;在 CPython 中使用 C 结构。变量只是对这些结构的引用(指针)。 CPython 中的基本类型结构称为 PyObject , 这个结构有一个 ob_type slot告诉 Python 某物是什么类型。类型只是 more C structures .

如果您想继续学习 CPython 源代码,您可以从 bltinmodule.c source code 开始。 (因为 type 是一个内置名称),其中 defines type as the PyType_Type structure .调用一个类型(type也是一个类型)调用它们的 tp_new function , 和 PyType_Type defines that作为the type_new function .此函数处理带有一个参数的调用,如下所示:

/* Special case: type(x) should return x->ob_type */
{
const Py_ssize_t nargs = PyTuple_GET_SIZE(args);
const Py_ssize_t nkwds = kwds == NULL ? 0 : PyDict_Size(kwds);

if (PyType_CheckExact(metatype) && nargs == 1 && nkwds == 0) {
PyObject *x = PyTuple_GET_ITEM(args, 0);
Py_INCREF(Py_TYPE(x));
return (PyObject *) Py_TYPE(x);
}

在这里xPyObject你传入的对象;注意,不是变量,而是对象!所以对于你的1整数对象或 'foobar'字符串对象,Py_TYPE()返回宏结果。 Py_TYPE is a macro那只是返回 ob_type任何 PyObject 的值结构。

所以现在你有了 1 的类型对象或 'foobar' ;你怎么看到<class 'int'><class 'str'>在你的口译 session 上? Python 交互式解释器自动使用 repr() function在任何表达式结果上。在 C 结构中为 PyType_Type定义 PyType_Type struct 已合并,因此该类型的所有插槽都可以直接使用;我将在这里省略 that 的具体工作原理。对于类型对象,使用 repr()表示 type_repr function被称为返回这个:

rtn = PyUnicode_FromFormat("<class '%s'>", type->tp_name);

所以最后,type(1)得到 ->ob_type slot,(在 Python 3 中原来是 PyLong_Type struct,说来话长),并且该结构有一个 tp_name slot set to "int" 。 .

TL;DR:Python 变量没有类型,它们只是指向对象的指针。 对象 有类型,如果您在解释器中回显对象,Python 解释器将遵循一系列间接引用以到达要打印的类型名称。

关于python - Python 解释器如何在动态类型中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38366857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com