python变量类型是动态的_【Python】python动态类型

在python中,省去了变量声明的过程,在引用变量时,往往一个简单的赋值语句就同时完成了,声明变量类型,变量定义和关联的过程,那么python的变量到底是怎样完成定义的呢?

动态类型

python使用动态类型和他提供的多态性来提供python语言的简洁灵活的基础。在python中我们是不会声明所使用对象的确切类型的。所谓的python动态类型,就是在程序运行的过程中自动决定对象的类型。

对象、变量和引用

当我们在赋值一个变量时,在python中其实自动做了很多事情。

1.创建变量:当代码第一次赋值给一个变量时就创建了这个变量,在之后的赋值过程关联值,python在代码运行之前先检验变量名,可以当成是最初的赋值创建变量。

2.变量声明:python中类型只存在于对象中,而不是变量,变量是通用的,他只是在程序的某一段时间引用了某种类型的对象而已,比如定义a =1 ,a = 'a',一开始定义了变量a为指向了整型的对象,然后变量又指向了字符串类型的变量,可见,变量是不固定的类型。

3.变量使用:变量出现在表达式中就会马上被对象所取代,无论对象是什么内类型,变量在使用前必须要先定义。

值得注意的是,变量必须在初始化名字之后才能更新他们,比如计数器初始化为0,然后才能增加他。

也就是说,当我们给变量赋值的时候,比如a=3,python执行三个不同操作去完成赋值。

1.创建一个对象代表3,

2.如果程序中没有变量a,则创建他。

3.将变量与对象3连接起来。

变量与对象是连接关系,它们存储在内存的不同位置,如果有列表嵌套这样大的对象,对象还连接到它包含的对象。这种从变量到对象的连接称为引用。

1165242-20170802075423677-1718026712.jpg

变量的引用以内存中的指针形式实现。一旦变量被使用,那么python自动跟变量的对象连接。具体来说:

1.变量是系统表的元素,他指向对象存放的地址空间。

2.对象是分配的一块内存,地址可被连接,有足够大空间代表对象的值,

3.引用的过程自动完成变量指向对象地址的过程,即从变量到对象的指针。

对象的垃圾回收

每个对象都有两个标准头部信息,一个是类型标志符,用于标记对象类型,另一个是引用计数器,用来决定是不是可回收对象。很显然,在python中只有对象才有类别区分,变量不过是引用了对象,变量并不具有类别区分,他只是在特定时间引用某个特定对象。

对于引用计数器的使用,则关联到python的垃圾回收机制,当当一个变量名赋予了一个新的对象,那么之前旧的对象占用的地址空间就会被回收。旧对象的空间自动放入内存空间池,等待后来的对象使用。

计数器在垃圾回收的过程中有事如何工作的呢?计数器记录的是当前指向对象的引用数目,如果在某时刻计数器设置为0,则表示未被引用,name这个对象的内存空间就会收回。

对象的垃圾回收有着很大的意义,这使得我们在python中任意使用对象而且不需要考虑释放空间,省去了C与C++中大量的基础代码。

共享引用(深浅拷贝的缘由)

当一个变量使用多个对象时,旧的对象会被垃圾收回,那么变量共享变量的对象有事一种什么样的类型呢?

a=‘hello world’

b=a

print(b)

运行结果:

hello world

值得一提的是,这里b变量引用的a作为值,根据python中赋值是以对象来完成的,所以b引用的应该是a变量指向的对象地址的值,故可以判断,改变a指向的对象并不会影响b的值。

a=‘hello world’

b=a

a='new hello world'

print(a)

print(b)

运行结果:

new hello world

hello world

1165242-20170802102841193-1531415169.png

python中变量总是一个指定对象的指针,而不是能够改变内存区域的标签,即给一个变量赋新的值,不是替换一个对象原始值,而是创建一个新得对象供变量引用。

当然这条只限于对象的类型不可改变,如果引用对象是像列表一样可供修改的对象那结果如何呢?

a=[1,2,3]

b=a

a.append(4)

print(a)

print(b)

运行结果:

[1, 2, 3, 4]

[1, 2, 3, 4]

结果很显然,对于可变类型对象,变量不会创建一个显得对象,而是沿用之前的对象,即使对象已经被改变了。可以简单的理解为,两个对象同时指向了一个列表的内存地址,而列表又映射了里面各元素的内存地址,变量的共享并不关注列表的改变,他们只关心列表的内存空间是否改变,所以,可变对象在引用时自身可以改变,所以不需要创建新的对象,所以共享对象会随之前对象的变化而变化。

这其实是我们不希望看到的。我们可以使用拷贝对象创建引用:

a=[1,2,3]

b=a[:]

a.append(4)

print(a)

print(b)

运行结果:

[1, 2, 3, 4]

[1, 2, 3]

这种方法并不适用于不可索引但是可变的字典与集合,所以python的copy模块用于变量引用:

import copy

a=[1,2,3,[1,2]]

b=copy.copy(a)

c=copy.deepcopy(a)

d=a

a.append(4)

a[3][0]=5

print(a)

print(b)

print(c)

print(d)

运行结果:

[1, 2, 3, [5, 2], 4]

[1, 2, 3, [5, 2]]

[1, 2, 3, [1, 2]]

[1, 2, 3, [5, 2], 4]

共享引用的补充

其实是关于垃圾回收的一点补充,对于一些小的整数或字符串,并不像我们说的那样计数器标记为0就被收回。这和python的缓存机制有关。对于一般的对象,python适用于垃圾收回。

a=[1,2,3]

b=[1,2,3]

c=a

print(a == c)

print(a == b)

print(a is c)

print(a is b)

运行结果:

True

True

True

False

对于小的整数与字符串则不同:

a=111

b=111

c=a

print(a == c)

print(a == b)

print(a is c)

print(a is b)

运行结果:

True

True

True

True

在python中,任何东西都是在赋值与引用中工作的,对于理解python动态类型,在以后的工作与学习时是有很大帮助的,这是python唯一的赋值模型,所以准确的理解与应用十分有必要。不对类型作约束,这使得python代码极为灵活,高效,并且省去了大量的代码,极为简洁,所以python是这样一门有艺术的编程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python bottle部署g_python bottle框架(WEB开发、运维开发)教程 | linux系统运维

教程目录一:python基础二:bottle基础python bottle 框架基础教程:环境部署三:WEB开发教程四:运维开发教程运维开发(1.1):框架、结构介绍运维开发(1.2):前端(ajax)说明运维开发(1.3):…

c语言excel转pdf,基于C语言和Excel软件下光速测量仪测量玻璃折射率.pdf

基于C语言和Excel软件下光速测量仪测量玻璃折射率.pdf基于语言和 软件下光速测量仪测量玻璃折射率 朱承君 王奇峰 芦立娟 张艳春 ( 浙江海洋学院机电学院 浙江 舟山 ) ( 收稿日期 ) 摘要 介绍了用等相位法测玻璃折射率的原理和方法, 并利用了 语言和 在科学计算中的…

python3.7界面_Python3.7+tkinter实现查询界面功能

Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。 这篇文章使用tkinter实现一个简单的查询界面 #!/usr/bin/python # -*- coding: UTF-8 -*- from tkinter import * import sqlite3 # 导入消息对话框子模块 import tkinter.messagebox #im…

python中级水平_python 初级/中级/高级/核心

"一等对象":满足条件:1.在运行时创建 2.能赋值给变量或数据结构中的元素 3.能作为参数传递给函数 4.能作为函数的返回结果[ 整数、字符串、字典、"所有函数" ]等都是一等对象"什么是函数"调用:直接使用、不需要类或对象进…

c语言报错spawning 插1,C语言错误····error spawning c1.exe

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼“CL.exe”是VC使用真正的编译器(编译程序),其路径在“VC根目录\VC98\Bin”下面,你可以到相应的路径下找到这个应用程序。因此问题可以按照以下方法解决:打开vc界面 点击VC“TOOLS(工具)”—>…

python中的元类_Python中的元类(metaclass)

提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解。他知道这肯定和自身有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程。 …

方言大全_长沙人亲戚称呼大全!记得收藏以防失传!

长沙人亲戚称呼大全!记得收藏以防失传!首先,看一下中国亲戚称谓图!▼长沙方言对于亲人的称谓自有一套说法!(如有不同,以你自己的叫法为准哦~)▼长辈篇父亲:ya、“爷(ya)老倌”,“爷(…

adb android源码分析,Android Adb 源码解析(base on Android 9.0)

Adb 框架Adb架构Android Adb 一共分为三个部分:adb、adb server、adbd,源码路径:system⁩/⁨core⁩/⁨adb。adb和adb server 是运行在PC端,adb就是大家所熟悉的控制台命令adb,adb server是由adb fork出的一个常驻后台的…

oracle 解锁 账户_oracle用户解锁三种方法

ORA-28000: the account is locked-的解决办法2009-11-11 18:51ORA-28000: the account is locked第一步:使用PL/SQL,登录名为system,数据库名称不变,选择类型的时候把Normal修改为Sysdba;第二步:选择myjob,查看users;第三步&…

android 解码webp动画,android webp编解码详解

key words:android decode webp sample当我敲下键盘的时候有种深深的耻辱感,看到android 4.0支持webp格式的图像,于是我狠命的找提供了什么样的api,nnd,硬是没找到,后来抱着试试的心态,用Bitmap…

python生成json_如何将Python数组转为Json格式数据并存储?

在Python中将数组转为Json数据存储时需要用到将json模块中的json.dumps()或者json.dump()方法。 json.dumps()方法用法 使用json.dumps( )方法将Python数组转为json格式数据 # 导入json模块 import json # 定义Python数组 py_list [{JavaEE: "http://java.itheima.com&qu…

rust里mp5a4_Rust源码分析:channel内部mpsc队列

首先,之前的upgrade过程中内存的回收要稍微注意下。因为Receiver现在指向shared::Packet之后,那个new_port需要被析构,也就是调用drop函数,我们看下drop的实现:implDropforReceiver{fn drop(&mutself){match*unsaf…

android settext 参数,Android TextView.setTextColor()的参数设置方式

摘要:Android TextView.setTextColor()的参数设置方式查了下资料发现setTextColor()的参数应该写成以下的这种形式:setTextColor(0xFF0000FF);//0xFF0000FF是int类型的数据,分组一下0x|FF|0000FF,0x是代表颜色整数的标记&#xff…

vscode angular智能提示_【线下活动】手把手教你玩转 VS Code 插件开发

感谢 Google Developer Group 的邀请,3 月 30 号下午,韩老师将手把手带你玩转 VS Code 插件开发。 Angular 使用了 TypeScript,VS Code 使用了 Chromium。感谢这个开放与包容的时代,技术无界,正是大家对技术有着执着的…

ext js如何动态更改xtype_K8S ConfigMap 用于动态应用程序的实践

编辑:小君君技术校对:星空下的文仔、bot在 Kubernetes 中,ConfigMap 是允许管理员将配置组件与镜像内容解耦,使容器化应用程序产生可移植性的一种资源。ConfigMap 可以与 Kubernetes Pod 一起使用,用于动态添加或更改容…

android contacts 编辑,如何在Android中的.csv文件中逐行编写contactn...

编辑.import java.io.File;import java.io.FileWriter;import java.io.IOException;import android.app.Activity;import android.content.Intent;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import andr…

python教材答案第六章_python第六章{输入和输出}

输出 用print加上字符串,就可以向屏幕上输出指定的文字。比如输出hello, world,用代码实现如下: >>>print hello, world print语句也可以跟上多个字符串,用逗号“,”隔开,就可以连成一串输出: >…

字长16位的计算机表示最大整数_废话不多说跪送计算机选择8前十题

1.字长是CPU的主要性能指标之一,它表示(a)a.CPU—一次能处理二进制数据的位数b.最长的十进制整数的位数c.最大的有效数字位数d.计算结果的有效数字长度答案解析【解析】字长是指计算机运算部件一次能同时处理的二进制数据的位数。2.字长为7位的无符号二进制整数能表示的十进制整…

python程序结构框架_Python——Flask框架——程序的基本结构

一、安装 pip install flask 二、初始化 from flask importFlask app Flash(__name__) 三、路由:处理URL和函数之间的关系的程序称为路由 (1)路由装饰器 app.route(/)defindex():return ( Hello World) (2)动态路由 ap…

阿里云python服务器_Python服务器

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":6,"count":6}]},"card":[{"des":"云服务器 ECS(Elastic Compute Service)是一…