Python进阶09 动态类型

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

谢谢TeaEra猫咪cat

动态类型(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 = 100
    print x

a = 1
f(a)
print a

参数x是一个新的引用,指向a所指的对象。如果参数是不可变(immutable)的对象,a和x引用之间相互独立。对参数x的操作不会影响引用a。这样的传递类似于C语言中的值传递。

如果传递的是可变(mutable)的对象,那么改变函数参数,有可能改变原对象。所有指向原对象的引用都会受影响,编程的时候要对此问题留心。比如说:

def f(x):
    x[0] = 100
    print x

a = [1,2,3]
f(a)
print a

动态类型是Python的核心机制之一。可以在应用中慢慢熟悉。

总结

引用和对象的分离,对象是内存中储存数据的实体,引用指向对象。

可变对象,不可变对象

函数值传递

时间: 2024-10-26 09:37:06

Python进阶09 动态类型的相关文章

python笔记2 python对象的动态类型

Python中的一切都是对象,并且这些对象都是Python的组成部分,即是内置对象,和python一同产生. 从更正式的角度来讲,在P ython中,数据以对象的形式出现一一无论是Py t hon提供的内置对象,还是使用Python或是像C扩展库这 样的扩展语言工具创建的对象.尽管在以后才能确定这一概念,但对象无非是内存中的一部分,包含数值和相关操作的集合. 内置对象 对象类型 例子常量/创建 数字 1234, 3.1415, 3+4j, Decimal. Fraction 字符串 'spam'

Python学习笔记整理(三)Python中的动态类型简介

Python中只有一个赋值模型 一.缺少类型声明语句的情况 在Python中,类型是在运行过程中自动决定的,而不是通过代码声明.这意味着没有必要事声明变量.只要记住,这个概念实质上对变量,对象和它们之间的关系都适用.那么这个概念也容易理解并掌握. 1.变量,对象和引用 变量创建:一个变量,当代码第一次给它赋值时它就被创建了.之后的赋值将会改变已创建的变量名的值.Python在代码运行之前先检测变量名,可以当成是最初的赋值创建变量. 变量类型:变量永远不会有任何的它关联的类型信息或约束.类型的概念

学习python语言的动态类型摘要

变量只是在一个特定的时间点对某一特定类型对象的引用,当变量出现在表达式中时,它会马上被当前引用的对象所代替,也就是说,在一个程序,同一个变量名可以引用任何类型的对象.而不受限于它最初的引用.类型属于对象,而不是属于变量,给一个变量赋一个新值,并不是替换了原始的对象,而是让这个变量去引用完全不同的一个对象. >>> a=11 >>> type(a) <class 'int'> >>> a='abc' >>> type(a)

Python的动态类型

动态类型:                                                      在python中,类型是在运行过程中自动决定的,而不是通过代码声明的. 变量:                                                                                     变量是一个系统表的元素,拥有指向对象的连接的空间 python中,类型的概念是存在于对象中的,而不是变量中,变量是通用的. 变量的使用

python学习笔记17(动态类型)

动态类型 在我们接触的对象中,有一类特殊的对象,是用于存储数据的,常见的该类对象包括各种数字,字符串,表,词典.在C语言中,我们称这样一些数据结构为变量,而在Python中,这些是对象. 对象是储存在内存中的实体.但我们并不能直接接触到该对象.我们在程序中写的对象名,只是指向这一对象的引用(reference). 引用和对象分离,是动态类型的核心.引用可以随时指向一个新的对象: a = 3 a = 'python' 第一个语句中,3是储存在内存中的一个整数对象,通过赋值,引用a指向对象3. 第二

Python 动态类型

Python 动态类型 1.Python中,类型是在运行过程中自动决定的,并不需要提前在代码中声明. 2.所有变量必须在使用前明确的赋值,否则将会产生错误.#例:NameError: name 'a' is not defined 3.赋值语句 a=3 代表了:创建一个对象代表3:创建一个变量a:将变量与新的对象3相连.实际上是到对象内存空间的一个指针! 4.上面的第3条可翻译为:变量是一个系统表的元素,拥有指向对象的链接的空间:对象是分配的一块内存,有足够空间来表示他们所代表的值:引用是自动形

Python&lt;9&gt;动态类型简介

动态类型以及它提供的多态性,无疑是Python语言简洁性和灵活性的基础. 一.变量 <1>变量创建 一个变量a,当代码第一次给它赋值时就创建了它,之后的赋值将会改变已创建的变量名的值. <2>变量类型 变量永远不会有任何的和它关联的类型信息或约束.变量原本是通用的,它只是在一个特定的时间点,简单的引用了 一下特定的对象而已. <3>变量使用 当变量出现在表达式中,它会马上被当前引用的对象所替代(对象是有类型的).此外所有的变量必须在使用前明确的 赋值,使用未赋值的变量会

Python学习笔记(五)Python动态类型和引用

动态类型以及由他提供的多态性是Python语言简洁性.灵活性的基础.Python中,类型是在运行过程中自动决定的,没有必要事先声明变量.记住,Python中变量和对象是划分开来的,这样才能能清楚的理解动态类型.再记住,赋值生成的是变量到对象的引用,而非拷贝. 1,单个变量引用 以a=3为例说明Python中单个变量引用的处理过程, 1)创建一个对象代表值3,此处是整型数字对象 2)如果变量a还没有被创建的话,创建变量a(已创建则无此步骤) 3)将变量与新的对象3连接 实际效果如下图所示,变量a和

《Python 学习手册4th》 第六章 动态类型简介

''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书)“重点笔记”“本章习题” - 标题1,二级标题用- 标题2,笔记大纲标题.习题题目- 加粗,16px ''' 重点笔记 : 摘要 动态类型是Python语言灵活性的根源(尤其是其提供的多态性) 一. 缺少类型声明语句的情况 在Python中,类型是在运行过程中自动决定的,而不是通过代码声明. 二. 变量.对