它如何将类 int 或 string 与我的变量关联起来
Python 没有。变量没有类型。只有变量引用的对象才有类型。变量很简单指向对象的名称.
例如,下面也显示了对象的类型,但是不涉及变量:
>>> type(1)
<class 'int'>
>>> type('foobar')
<class 'str'>
当你使用type(variable)
, the variable
表达式的一部分只是返回 name 引用的对象,传入object to the type()
功能。使用时1
or 'foobar'
,表达式是产生对象的文字,然后将其传递给type()
功能。
Python 对象只是解释器内存中的数据结构;在 CPython 中使用 C 结构体。变量只是这些结构的引用(指针)。 CPython 中的基本类型结构体称为PyObject,这个结构体有一个ob_type slot它告诉 Python 某物是什么类型。类型很简单更多 C 结构.
如果您想继续了解 CPython 源代码,您可以从bltinmodule.c源代码 (since type
是一个内置名称),其中defines type as the PyType_Type结构。呼叫一个type (type
is a type也)调用他们的tp_new功能, and PyType_Type 定义了 as the type_new功能。该函数处理调用one论证如下:
/* 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);
}
Here x
is the PyObject
你传入的对象;注意,不是变量,而是对象!所以对于你的1
整数对象或'foobar'
字符串对象,Py_TYPE()
返回宏结果。Py_TYPE是一个宏简单地返回ob_type
任何值PyObject
结构。
所以现在你有了类型对象1
or 'foobar'
;你怎么会看到<class 'int'>
or <class 'str'>
在您的口译会议中? Python 交互式解释器自动使用repr()功能对任何表达式结果。在 C 结构中PyType_Type
定义 的PyType_Type
struct 被合并,因此该类型的所有插槽都可以直接使用;我将在这里省略具体方法that作品。对于类型对象,使用repr()
意味着type_repr功能被调用返回:
rtn = PyUnicode_FromFormat("<class '%s'>", type->tp_name);
所以最后,type(1)
得到->ob_type
插槽,(结果是PyLong_Type struct在 Python 3 中,说来话长),并且该结构有一个tp_name插槽设置为"int".
TL;DR:Python变量没有类型,它们只是指向对象的指针。Objects具有类型,如果您在解释器中回显该对象,Python 解释器将遵循一系列间接引用来到达要打印的类型名称。