转自: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 --动态类型相关推荐

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

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

  2. python动态类型是如何实现的_Python 的动态类型系统

    Python 与 ABC 的一个重要区别在于其类型系统. ABC 采用静态类型,编译器会检查程序中的变量类型是否保持一致,如果不一致,程序就无法运行.并且,ABC与当时大多数静态语言不同,采用的是类型 ...

  3. python 动态类型检测 性能_4种速度最慢的动态编程语言,你一定用过

    编程语言已经存在很多年,每种语言都是为了满足特定的需要而构建的. 到今天为止,全世界大约有700种编程语言.现在仅剩250种语言能存续下来,其余的基本上已经被编程社区抛弃了. 对于程序员来说,性能一直 ...

  4. python动态类型的坑_python进阶教程之动态类型详解

    动态类型(dynamic typing)是Python另一个重要的核心概念.我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值.这些都与动态类型的概念 ...

  5. python 动态类型_动态类型(Dynamic type)

    在学习更复杂的对象类型之前,先掌握python的动态类型这一概念,是十分必要的.动态类型以及它提供的多态性是python语言简洁性和灵活性的基础. -------------------------- ...

  6. python 动态类型性能_动态且强类型的Python

    参考自 类型系统 强类型:偏向于不容忍隐式类型转换.譬如说haskell的int就不能变成double 弱类型:偏向于容忍隐式类型转换.譬如说C语言的int可以变成double 静态类型:编译的时候就 ...

  7. python 动态类型语言,Python 3.7.0 面向对象的动态类型语言

    代表Python开发社区和Python 3.7发布团队,我们很高兴地宣布 https://www.python.org/downloads/release/python-370/ Python的大多数 ...

  8. python 动态类型_python学习--动态类型

    #-*- coding:utf-8 -*- ''' Created on 2010-8-27 @author: qichen ''' import sys #===================== ...

  9. python动态类型的坑_在Python中避免动态类型错误的策略是什么(NoneType没有属性x)?...

    forgetting to check a type 这没什么意义.你很少需要"检查"一个类型.你只需运行单元测试,如果你提供了错误的类型对象,事情就会失败.根据我的经验,你不需要 ...

最新文章

  1. python两个集合的交集 合集 差集
  2. 几种距离公式的总结思考
  3. 小白使用Eclipse 的基本设置
  4. 渗透测试工具Nmap从初级到高级
  5. 如何在php中添加音乐播放器,音乐播放器的制作实例(html5)-
  6. 计算机游戏 ppt背景图片,课件背景图片大全
  7. app开发,开发app的具体步骤来啦
  8. 卧槽?原来修出网红脸高清照片可以这样简单,这次把汉化的插件提供给大家!
  9. (已解决)STM32报错Error: L6218E: Undefined symbol assert_param (referred from misc.o).
  10. __init__() takes 1 positional argument but 5 positional arguments (and 1 keyword-only argument) were
  11. 了解python正则表达式
  12. 金仓数据库KingbaseES使用ksql连接认证失败
  13. 【归档】Prove that the set of continuous real-valued functions on the interval [0, 1] is a subspace...
  14. Python 求列表的最长升序子列
  15. idea报错:org.codehaus.plexus.component.repository.exception.ComponentLookupException
  16. 二分图最大权匹配问题KM算法讲解 HDU 2255 奔小康赚大钱
  17. 六轴机械臂mycobot初体验
  18. 【项目实战】Python基于Lasso特征选择、GM算法和SVR回归算法进行财政收入影响因素分析及预测
  19. 朱丹老师课程学习笔记:10、生活便捷—购物、美食、看病时这样搜,至少能省一半心
  20. 知乎高清原图下载python极简脚本

热门文章

  1. 计算机课中排序选什么,《计算机应用基础课件》1.6 排序复习课程.ppt
  2. 结合反向传播算法使用python实现神经网络的ReLU、Sigmoid、Affine、Softmax-with-Loss层
  3. Altium Designer20原理图库制作
  4. java容器遍历_高效遍历Java容器详解
  5. @postconstruct注解方法没有执行_被标记为事务的方法互相调用的坑(下)
  6. java编写服务器_java编写一个简单的回射服务器
  7. HTML+CSS+JS实现 ❤️个人相册封面卡片❤️
  8. android+引用非+android+工程,[非原创]编译android C++工程找不到exception handle的解决办法...
  9. 放大镜_屏幕放大镜怎么样使用方法
  10. Mysql 零距离-入门(五)操作数据表