python --动态类型
转自:http://www.cnblogs.com/vamei/archive/2012/07/10/2582795.html
动态类型(dynamic typing)是Python另一个重要的核心概念。我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值。这些都与动态类型的概念相关。
动态类型
在我们接触的对象中,有一类特殊的对象,是用于存储数据的。常见的该类对象包括各种数字,字符串,表,词典。在C语言中,我们称这样一些数据结构为变量。而在Python中,这些是对象。
对象是储存在内存中的实体。但我们并不能直接接触到该对象。我们在程序中写的对象名,只是指向这一对象的引用(reference)。
引用和对象分离,是动态类型的核心。引用可以随时指向一个新的对象:
a = 3 a = 'at'
第一个语句中,3是储存在内存中的一个整数对象。通过赋值,引用a指向对象3。
第二个语句中,内存中建立对象‘at’,是一个字符串(string)。引用a指向了'at'。此时,对象3不再有引用指向它。Python会自动将没有引用指向的对象销毁(destruct),释放相应内存。
(对于小的整数和短字符串,Python会缓存这些对象,而不是频繁的建立和销毁。)
a = 5 b = a a = a + 2
再看这个例子。通过前两个句子,我们让a,b指向同一个整数对象5(b = a的含义是让引用b指向引用a所指的那一个对象)。但第三个句子实际上对引用a重新赋值,让a指向一个新的对象7。此时a,b分别指向不同的对象。我们看到,即使是多个引用指向同一个对象,如果一个引用值发生变化,那么实际上是让这个引用指向一个新的引用,并不影响其他的引用的指向。从效果上看,就是各个引用各自独立,互不影响。
其它数据对象也是如此:
L1 = [1,2,3] L2 = L1 L1 = 1
但注意以下情况
L1 = [1,2,3] L2 = L1 L1[0] = 10 print L2
在该情况下,我们不再对L1这一引用赋值,而是对L1所指向的表的元素赋值。结果是,L2也同时发生变化。
原因何在呢?因为L1,L2的指向没有发生变化,依然指向那个表。表实际上是包含了多个引用的对象(每个引用是一个元素,比如L1[0],L1[1]..., 每个引用指向一个对象,比如1,2,3), 。而L1[0] = 10这一赋值操作,并不是改变L1的指向,而是对L1[0], 也就是表对象的一部份(一个元素),进行操作,所以所有指向该对象的引用都受到影响。
(与之形成对比的是,我们之前的赋值操作都没有对对象自身发生作用,只是改变引用指向。)
列表可以通过引用其元素,改变对象自身(in-place change)。这种对象类型,称为可变数据对象(mutable object),词典也是这样的数据类型。
而像之前的数字和字符串,不能改变对象本身,只能改变引用的指向,称为不可变数据对象(immutable object)。
我们之前学的元组(tuple),尽管可以调用引用元素,但不可以赋值,因此不能改变对象自身,所以也算是immutable object.
从动态类型看函数的参数传递
函数的参数传递,本质上传递的是引用。比如说:
def f(x):x = 100print xa = 1 f(a) print a
参数x是一个新的引用,指向a所指的对象。如果参数是不可变(immutable)的对象,a和x引用之间相互独立。对参数x的操作不会影响引用a。这样的传递类似于C语言中的值传递。
如果传递的是可变(mutable)的对象,那么改变函数参数,有可能改变原对象。所有指向原对象的引用都会受影响,编程的时候要对此问题留心。比如说:
def f(x):x[0] = 100print xa = [1,2,3] f(a) print a
动态类型是Python的核心机制之一。可以在应用中慢慢熟悉。
总结
引用和对象的分离,对象是内存中储存数据的实体,引用指向对象。
可变对象,不可变对象
函数值传递
转载于:https://www.cnblogs.com/saryli/p/5019315.html
python --动态类型相关推荐
- python变量类型是动态的_【Python】python动态类型
在python中,省去了变量声明的过程,在引用变量时,往往一个简单的赋值语句就同时完成了,声明变量类型,变量定义和关联的过程,那么python的变量到底是怎样完成定义的呢? 动态类型 python使用 ...
- python动态类型是如何实现的_Python 的动态类型系统
Python 与 ABC 的一个重要区别在于其类型系统. ABC 采用静态类型,编译器会检查程序中的变量类型是否保持一致,如果不一致,程序就无法运行.并且,ABC与当时大多数静态语言不同,采用的是类型 ...
- python 动态类型检测 性能_4种速度最慢的动态编程语言,你一定用过
编程语言已经存在很多年,每种语言都是为了满足特定的需要而构建的. 到今天为止,全世界大约有700种编程语言.现在仅剩250种语言能存续下来,其余的基本上已经被编程社区抛弃了. 对于程序员来说,性能一直 ...
- python动态类型的坑_python进阶教程之动态类型详解
动态类型(dynamic typing)是Python另一个重要的核心概念.我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值.这些都与动态类型的概念 ...
- python 动态类型_动态类型(Dynamic type)
在学习更复杂的对象类型之前,先掌握python的动态类型这一概念,是十分必要的.动态类型以及它提供的多态性是python语言简洁性和灵活性的基础. -------------------------- ...
- python 动态类型性能_动态且强类型的Python
参考自 类型系统 强类型:偏向于不容忍隐式类型转换.譬如说haskell的int就不能变成double 弱类型:偏向于容忍隐式类型转换.譬如说C语言的int可以变成double 静态类型:编译的时候就 ...
- python 动态类型语言,Python 3.7.0 面向对象的动态类型语言
代表Python开发社区和Python 3.7发布团队,我们很高兴地宣布 https://www.python.org/downloads/release/python-370/ Python的大多数 ...
- python 动态类型_python学习--动态类型
#-*- coding:utf-8 -*- ''' Created on 2010-8-27 @author: qichen ''' import sys #===================== ...
- python动态类型的坑_在Python中避免动态类型错误的策略是什么(NoneType没有属性x)?...
forgetting to check a type 这没什么意义.你很少需要"检查"一个类型.你只需运行单元测试,如果你提供了错误的类型对象,事情就会失败.根据我的经验,你不需要 ...
最新文章
- python两个集合的交集 合集 差集
- 几种距离公式的总结思考
- 小白使用Eclipse 的基本设置
- 渗透测试工具Nmap从初级到高级
- 如何在php中添加音乐播放器,音乐播放器的制作实例(html5)-
- 计算机游戏 ppt背景图片,课件背景图片大全
- app开发,开发app的具体步骤来啦
- 卧槽?原来修出网红脸高清照片可以这样简单,这次把汉化的插件提供给大家!
- (已解决)STM32报错Error: L6218E: Undefined symbol assert_param (referred from misc.o).
- __init__() takes 1 positional argument but 5 positional arguments (and 1 keyword-only argument) were
- 了解python正则表达式
- 金仓数据库KingbaseES使用ksql连接认证失败
- 【归档】Prove that the set of continuous real-valued functions on the interval [0, 1] is a subspace...
- Python 求列表的最长升序子列
- idea报错:org.codehaus.plexus.component.repository.exception.ComponentLookupException
- 二分图最大权匹配问题KM算法讲解 HDU 2255 奔小康赚大钱
- 六轴机械臂mycobot初体验
- 【项目实战】Python基于Lasso特征选择、GM算法和SVR回归算法进行财政收入影响因素分析及预测
- 朱丹老师课程学习笔记:10、生活便捷—购物、美食、看病时这样搜,至少能省一半心
- 知乎高清原图下载python极简脚本
热门文章
- 计算机课中排序选什么,《计算机应用基础课件》1.6 排序复习课程.ppt
- 结合反向传播算法使用python实现神经网络的ReLU、Sigmoid、Affine、Softmax-with-Loss层
- Altium Designer20原理图库制作
- java容器遍历_高效遍历Java容器详解
- @postconstruct注解方法没有执行_被标记为事务的方法互相调用的坑(下)
- java编写服务器_java编写一个简单的回射服务器
- HTML+CSS+JS实现 ❤️个人相册封面卡片❤️
- android+引用非+android+工程,[非原创]编译android C++工程找不到exception handle的解决办法...
- 放大镜_屏幕放大镜怎么样使用方法
- Mysql 零距离-入门(五)操作数据表