首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python如何以及何时确定变量的数据类型?

Python如何以及何时确定变量的数据类型?
EN

Stack Overflow用户
提问于 2018-11-23 07:13:29
回答 3查看 2.8K关注 0票数 11

我试图弄清楚Python3(使用CPython作为解释器)是如何执行其程序的。我发现这些步骤是:

  1. 将Python源代码(.py文件)由CPython编译器编译为Python (.pyc)文件。在导入任何模块的情况下,保存.pyc文件,如果运行一个main.py Python脚本,则不会保存它们。
  2. Python虚拟机将字节码解释成硬件专用的机器代码。

这里发现的一个很好的答案是,与JVM相比,Python运行字节码所需的时间更长,因为java字节码包含有关数据类型的信息,而Python则逐一解释行并确定数据类型。

我的问题是是如何确定数据类型的,它是发生在对机器代码的解释中还是在单独的过程中(例如,这会产生另一个中间代码)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-24 08:07:07

CPython的动态、运行时分派(与静态的、编译时分派的CPython相比)只是原因之一,它比纯CPython更快: Java中有jit编译、不同的垃圾收集策略、本地类型(如intdouble和CPython中的不可变数据结构)的存在等等。

我之前的肤浅实验已经表明,动态调度只负责大约30%的运行--您无法用它解释某些重要因素的速度差异。

为了减少这个答案的抽象性,让我们看一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def add(x,y):
   return x+y

查看字节码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import dis
dis.dis(add)

这意味着:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2         0 LOAD_FAST                0 (x)
          2 LOAD_FAST                1 (y)
          4 BINARY_ADD
          6 RETURN_VALUE

我们可以看到,在字节码的级别上,无论xy是整数、浮点数还是其他什么,都没有区别--解释器并不在意。

Java中的情况完全不同:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int add(int x, int y) {return x+y;}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
float add(float x, float y) {return x+y;}

将导致完全不同的操作码,调用分派将在编译时发生--根据编译时已知的静态类型选择正确的版本。

CPython-解释器通常不需要知道确切的参数类型:内部有一个基本的“类/接口”(显然C中没有类,所以它被称为“协议”,但是对于知道C++/Java的人来说,“接口”可能是正确的心理模型),所有其他“类”都是从这个模型派生出来的。这个基类称为PyObject这是对其协议的描述。。因此,只要函数是这个协议/接口的一部分,CPython解释器就可以调用它,而不知道确切的类型,调用将被分派到正确的实现(很像C++中的“虚拟”函数)。

在纯Python方面,似乎变量没有类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a=1
a="1"

但是,在内部a有一个类型--它是PyObject*,这个引用可以绑定到一个整数(1)和一个unicode-string ("1") --因为它们都是从PyObject“继承”的。

CPython解释器不时尝试查找引用的正确类型,上述示例也是如此--当它看到BINARY_ADD-opcode时,以下C代码将被执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    case TARGET(BINARY_ADD): {
        PyObject *right = POP();
        PyObject *left = TOP();
        PyObject *sum;
        ...
        if (PyUnicode_CheckExact(left) &&
                 PyUnicode_CheckExact(right)) {
            sum = unicode_concatenate(left, right, f, next_instr);
            /* unicode_concatenate consumed the ref to left */
        }
        else {
            sum = PyNumber_Add(left, right);
            Py_DECREF(left);
        }
        Py_DECREF(right);
        SET_TOP(sum);
        if (sum == NULL)
            goto error;
        DISPATCH();
    }

在这里,解释器查询两个对象是否都是unicode字符串,如果是这样的话,使用一种特殊的方法(实际上,它试图改变不变的unicode-object就地,请参阅此回答),否则工作将被分派到PyNumber-protocol。

显然,解释器还必须知道创建对象的确切类型,例如,对于a="1"a=1使用不同的“类”--但正如我们所看到的,它并不是唯一的位置。

因此,解释器在运行时会干扰类型,但大多数情况下,它不必这样做--可以通过动态分派来达到目标。

票数 4
EN

Stack Overflow用户

发布于 2018-11-25 16:12:53

避免在Python中考虑“变量”可能对您的理解很有用。与必须将类型与变量、类成员或函数参数相关联的静态类型化语言相比,Python只处理对象的“标签”或名称。

所以在片段里,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = "a string"
a = 5 # a number
a = MyClass() # an object of type MyClass

标签a从来没有类型。它只是一个在不同时间指向不同对象的名称(实际上,在其他语言中指向“指针”非常类似)。另一方面,对象(字符串、数字)总是有一个类型。这种类型的性质可能会改变,因为您可以动态地更改类的定义,但它将始终被确定,即由语言解释器知道。

因此,要回答这个问题: Python从不确定变量的类型(标签/名称),它只使用它来引用对象,而该对象有一个类型。

票数 2
EN

Stack Overflow用户

发布于 2018-11-23 08:02:22

Python是围绕鸭类输入的哲学构建的。不进行显式类型检查,即使在运行时也不会发生。例如,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> x = 5
>>> y = "5"
>>> '__mul__' in dir(x)
>>> True
>>> '__mul__' in dir(y)
>>> True
>>> type(x)
>>> <class 'int'>
>>> type(y)
>>> <class 'str'>
>>> type(x*y)
>>> <class 'str'>

CPython解释器检查xy是否定义了__mul__方法,并尝试“使其工作”并返回结果。而且,Python字节码从未被翻译成机器代码。它在CPython解释器中执行。JVM和CPython虚拟机之间的一个主要区别是,JVM可以随时将Java字节码编译成机器代码,以提高性能(JIT编译),而CPython VM只按原样运行字节码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53449112

复制
相关文章
变量以及数据类型_数据类型定义
变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,而通过变量名可以访问到变量(值)
全栈程序员站长
2022/11/01
1K0
变量以及数据类型_数据类型定义
Go-数据类型以及变量,常量
指针类型(Pointer) 数组类型 结构化类型(struct) Channel 类型 函数类型 切片类型 接口类型(interface) Map 类型
小小咸鱼YwY
2020/06/19
3120
用于确定 SQL Server recovery何时完成的脚本
◆ 一、概述 无论是硬件故障、损坏、错误查询还是良性迁移,在BI/DBA 职业生涯中,您肯定会多次遇到数据库恢复问题。通常,很难为最终用户和主管准确估计数据库何时恢复运行。一般的 DBA 可能会觉得他们好像在盯着一个黑匣子,只是等待和刷新,直到数据库完成恢复。下面分享一个更简单的方法! ◆ 二、解决方案 您知道 SQL Server 的 ERRORLOG 实际上会计算自己的估计值吗?日志条目有时可能会让人不知所措且过于详细,因此我们将使用一个简单的 SQL 查询来生成易于阅读且令人惊讶的准确估计结果。 我们
IT大咖说
2022/09/22
1K0
用于确定 SQL Server recovery何时完成的脚本
【Python】Python 变量 ( 变量定义 | 修改变量值 | 变量数据类型 | type 获取数据类型 )
在之前的 【Python】Python 字面量 ( Python 数据类型 | Python 字面量含义 | 使用 print 函数输出字面量 ) 博客中 , 介绍了数据类型 ;
韩曙亮
2023/04/04
1.3K0
【Python】Python 变量 ( 变量定义 | 修改变量值 | 变量数据类型 | type 获取数据类型 )
JVM如何确定垃圾以及常用参数
Java中,引用和对象是有关联的。如果要操作对象则必须引用进行。因此,简单的办法是通过引用计数来判断一个对象是否可以回收。简单的说,给对象中添加一个引用计数,每当有一个引用失效时,计数器值减1,任何时刻计数器值为0的对象就是不可能再被利用的,那么这个对象就是可回收对象。那么为什么主流的Java虚拟机里面都没有选择这种算法呢?主要的原因是它很难解决对象之间相互循环引用的问题。
万能青年
2019/08/30
8040
JVM如何确定垃圾以及常用参数
python的变量以及常量介绍
  命名规范:   1. 数字, 字母, 下划线组成   2. 不能数字开头, 更不能是纯数字   3. 不能用关键字   4. 不要用中文   5. 要有意义   6. 不要太长   7. 区分大小写   8. 驼峰或者下划线命名
py3study
2020/01/20
4870
Python变量与数据类型
企鹅号小编
2018/01/09
1.1K0
Python变量与数据类型
Python:变量与数据类型
在 Python 中 变量命名规定,必须是大小写英文,数字和 下划线(_)的组合,并且不能用数字开头。
HLee
2021/03/02
9560
Python:变量与数据类型
python变量与数据类型
访问python 官网下载python安装python https://www.python.org/
py3study
2020/01/06
4070
python变量和数据类型
Python中可以自定义数据类型,可以具有无限种数据类型。系统默认提供6个标准数据类型
不止于python
2022/05/31
4970
数据类型和变量-Python
在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言,例如:
一朵灼灼华
2022/08/05
3080
python 变量与数据类型
字典也叫hashtable, 通过hash(散列)函数将传入的key值生成地址来查找value
友儿
2022/09/26
3780
何时以及如何在你的本地开发环境中使用 HTTPS
翻译:布兰 作者:Maud Nalpas https://web.dev/when-to-use-local-https/ https://web.dev/how-to-use-local-https/
用户4456933
2021/06/01
2.7K0
何时以及如何在你的本地开发环境中使用 HTTPS
python安装、数据类型和变量
2018.06.06 1.1为什么要学习python 学习方法: 边看边做不能只看不做 笔记要记录详细
py3study
2020/01/06
5980
python安装、数据类型和变量
Python 基础 数据类型 变量常量
整数:Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如:1,100,-8080,0,等等。十六进制用0x前缀和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等。
heasy3
2020/08/01
6850
Python 基础 变量和数据类型
  python 数据类型       一,整数,可以出来任意大小的整数。 如 1, 100, -8080,0 等等。       二,浮点数,浮点数也可以被成为小数。       三,字符串,字符串是以'' 或"".       四,布尔值,布尔值和布尔代数的表示完全一致,一个布尔值只有 True ,False.       五,空值,空值是Python 里一个特殊的值,用None 表示,None 不能理解为0,         因为0 是有意义的,而不是None是一个特殊的空值。   print 语句:
用户1197315
2018/04/04
5580
【Python】2“数据类型和变量”
编程语言当中,多数基础的特征都是相通的,但会在语法上异同,在学习Python的过程中,我常常会将它们与我学习过Java、C比较,比较它们的异同。
肓己
2021/08/12
3070
python基础-数据类型与变量
转载于:廖雪峰的官方网站-python教程 数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值。但是,计算机能处理的远不止数值,还可以处理文本、图形、音频、视频、网页等各种各样的数据,不同的数据,需要定义不同的数据类型。在Python中,能够直接处理的数据类型有以下几种: 整数 Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如:1,100,-8080,0,等等。 计算机由于使用二进制,所以,有时候用十六进制表示整数比
昱良
2018/04/08
1K0
python基础-数据类型与变量
golang基础(一)go的特点、数据类型以及变量的定义
静态类型语言:与动态类型语言刚好相反,它的数据类型检查发生在在编译阶段,也就是说在写程序时要声明变量的数据类型。C/C++、C#、Java都是静态类型语言的典型代表。
GH
2020/03/25
1.6K0
《4》python数据类型和变量
(4)python数据类型和变量 整数 Python可以处理任意大小的整数,例如:1,100,-8080,0,等等。 十六进制用0x前缀和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等。 浮点数 浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x109和12.3x108是完全相等的。浮点数可以用数学写法,如1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x1
企鹅号小编
2018/02/28
8670
《4》python数据类型和变量

相似问题

何时使用Tensorflow变量以及numpy或python变量

10

何时以及如何使用ThreadLocal变量?

252

何时以及如何使用Python的RLock

36

确定何时发生触地,以及何时释放触地

20

如何确定记录的编号,以及何时按日期顺序

121
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文