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

2023-11-25

我读过这个问题,但它没有给我明确的答案:Python解释器如何寻找类型?

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

它怎么知道这是一个 int:

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

或该字符串:

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

它如何将类 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_Typestruct 被合并,因此该类型的所有插槽都可以直接使用;我将在这里省略具体方法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 解释器将遵循一系列间接引用来到达要打印的类型名称。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 解释器如何在动态类型中工作? 的相关文章

随机推荐

  • 在 Google 电子表格中运行脚本时出现权限错误

    我们正在开发一个使用 Google 电子表格作为输入的程序 电子表格的值被读取 处理 结果显示在网页中 当用户注册时 我们使用服务帐户从模板克隆电子表格 该模板有一些我们想要用来帮助用户在电子表格上引入值的脚本 但这些脚本似乎拥有服务帐户的
  • 如何创建类似 App Store 精选页面的布局?

    我是 iOS 开发新手 根据我的假设 App Store 中的功能页面是使用 UITableView 和 UICollectionView 的组合创建的 但在理论上和代码上如何做到这一点呢 我知道这有点模糊 因为很难描述它 但我只是需要一些
  • 如何在VBA中的公式中插入变量

    有人能解决这个问题吗 Sub test Dim i as integer For I 1 to 10 ActiveCell Offset 0 2 Formula Sum E15 i Next I End Sub 你的实际目标不清楚 你可能想
  • Git 日志不显示任何内容

    我有许多 git 存储库 带有提交 每个存储库在运行时都不显示任何内容git log 如果我在项目目录之外运行命令 没有 git 存储库 我会得到 致命 不是 git 存储库 或任何父目录 git 我尝试重新安装 Git 我现在运行的是 1
  • Python模块名称冲突

    我遇到过两个必须使用相同模块名称导入的 Python 模块 例如 import foo 我知道我想要的那个提供了某些功能 例如foo bar 那么有没有一种方法可以循环使用同名的模块 直到找到提供这些功能的模块 或者除了在安装之前重命名模块
  • 大数字的 CSS 字距调整

    我意识到在美国 大量的数字都是用 数以千计之间 所以你会写 1 000 000 00 在南非 是非标准的 可以用作小数点而不是 我们会写 1000000 00读起来很糟糕 典型的解决方案是使用一些空格 1 000 000 00 该解决方案的
  • 在变量周围使用大括号 (Brace) C++

    我正在编程课上学习二维数组 我的老师在没有解释的情况下使用了一些东西 我很好奇我们为什么使用它 由于它与符号有关 我不确定如何谷歌或搜索它 因为这些符号在搜索本身中使用 无论如何 代码是这样的 int small 26 0 large 26
  • 使用 Android api 创建新的同步日历

    我正在尝试在我的帐户上创建一个日历 以填充我从某些网站获得的事件 我搜索并找到了一些新的 android 4 0 日历示例 我对其进行了修改以获得我需要的内容 问题是日历已创建 其中充满了事件 但未与谷歌日历同步 因此在下次同步时它会被删除
  • ForkJoinPool 调度与 ExecutorService

    我对内部调度机制有点困惑ExecutorService和ForkJoinPool 我明白了ExecutorService调度已完成this way 一堆任务排队 一旦线程可用 它将处理第一个可用任务 依此类推 与此同时 一个ForkJoin
  • NHibernate Win Forms 会话管理

    我之前在 Web 应用程序中使用过 NHibernate 我必须承认 我仍在学习 NHibernate 并没有完全掌握会话管理的艺术 所以我想在我正在编写的 Win Forms 应用程序中使用 NHibernate 我听说表单应用程序中的会
  • Bash 在 rsync/subshel​​l exec 语句期间不捕获中断

    Context 我有一个 bash 脚本 其中包含一个子 shell 和一个用于 EXIT 伪信号的陷阱 并且它在执行期间没有正确捕获中断rsync 这是一个例子 bin bash logfile path to file director
  • 有没有针对 SQL Server 的查询优化工具? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有任何工具可以对 SQL Server 2005 及更高版本进行查询优化 我已经搜索过并没有找到任何东西 你有什么建议吗 如果在您关闭之前重复了
  • 页面如何告诉浏览器存在 AMP HTML 版本?

    我知道我将有两页 AMP 一页和常规一页 AMP 版本具有到常规版本的规范链接 但常规版本如何指定有可用的 AMP 版本 The AMP 文档发现文档指定您需要在 举例来说 如果您查看已支持 AMP 的发布商的页面 例如http www b
  • 互相关会产生滞后吗?

    假设有两个信号 import numpy dt 0 001 t steps np arange 0 1 dt a sig np sin 2 np pi t steps 4 5 b sig np sin 2 np pi t steps 4 我
  • 如何在 Neo4j/Cypher 中返回复合对象

    我想使用 cypher 从 Neo4j 返回一个复合对象来整理我的查询 举个例子 我有一个用户帐户对象 其权限存储为关系 权限是复杂的对象 因此无法嵌套 它们现在通过关系 HAS PERMISSION 链接 我想要做的是返回已嵌套权限的完整
  • 将整数插入 Start 中的阿拉伯字符串

    我试图将整数添加到阿拉伯字符串但没有成功 Arabic String Astr String with Integer 1 num 1 Adding Strings r Astr num r num Astr 输出 1 期望的输出 1 我想
  • 模拟器中的 iOS 6 自动旋转与实际 iOS 6 设备不同

    我的应用程序不会在 iOS 6 GM 模拟器中自动旋转 但它会在设备上的相同版本的 iOS 中自动旋转 这可能是模拟器的错误吗 该应用程序正在使用已弃用的自动旋转方法 但它们在设备本身上运行良好 这让我想知道模拟器 API 是否不同 它应该
  • Qt SDK、Apwrapper:它是什么,它有什么作用。

    我已阻止 Visual Studio 的网络连接 使用 Visual Studio 添加安装 Qt SDK 后 我收到一条错误消息 无法连接到 AppWrapper 卸载了 SDK 并且不再尝试连接到 AppWrapper 随 Qt 安装的
  • 关于未引用变量的 JavaScript 闭包

    我知道有关闭包的精彩帖子here and here 但似乎都没有解决我想到的具体情况 这个问题最好用代码来证明 function foo var x var y whatever return function bar alert y va
  • Python 解释器如何在动态类型中工作?

    我读过这个问题 但它没有给我明确的答案 Python解释器如何寻找类型 python解释器如何知道变量的类型 我不是在寻找如何获得类型 我在这里看看幕后发生的事情 在下面的示例中 它如何将类 int 或 string 与我的变量关联起来 它