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

动态类型

在我们接触的对象中,有一类特殊的对象,是用于存储数据的,常见的该类对象包括各种数字,字符串,表,词典。在C语言中,我们称这样一些数据结构为变量,而在Python中,这些是对象。

对象是储存在内存中的实体。但我们并不能直接接触到该对象。我们在程序中写的对象名,只是指向这一对象的引用(reference)。

引用和对象分离,是动态类型的核心。引用可以随时指向一个新的对象:

a = 3
a = ‘python‘

第一个语句中,3是储存在内存中的一个整数对象,通过赋值,引用a指向对象3。

第二个语句中,内存中建立对象‘python’,是一个字符串(string)。引用a指向了‘python‘。此时,对象3不再有引用指向它。Python会自动将没有引用指向的对象销毁(destruct),释放相应内存。

(对于小的整数和短字符串,Python会缓存这些对象,而不是频繁的建立和销毁。)

>>> a = 5
>>> b = a    # 让引用b指向引用a所指的那一个对象
>>> a = a + 2 # 对引用a重新赋
>>> print a
7
>>> print b
5

上面这个例子,通过前两个句子,我们让a,b指向同一个整数对象5,但第三个句子实际上对引用a重新赋值,让a指向一个新的对象7。此时a,b分别指向不同的对象。我们看到,即使是多个引用指向同一个对象,如果一个引用值发生变化,那么实际上是让这个引用指向一个新的引用,并不影响其他的引用的指向。从效果上看,就是各个引用各自独立,互不影响。

其它数据对象也是如此:

>>> L1 = [1,2,3]
>>> L2 = L1
>>> L1 = 1
>>> print L1
1
>>> print L2
[1, 2, 3]

但以下情况需注意:

>>> L1 = [1,2,3]
>>> L2 = L1
>>> L1[0] = 10
>>> print L1
[10, 2, 3]
>>> print L2
[10, 2, 3]

在该情况下,我们不再对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)
100
>>> print a
1

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

如果传递的是可变(mutable)的对象,那么改变函数参数,有可能改变原对象,所有指向原对象的引用都会受影响。

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

>>> a=[1,2,3]
>>> f(a)
[100, 2, 3]
>>> print a
[100, 2, 3]
时间: 2024-11-24 17:21:38

python学习笔记17(动态类型)的相关文章

Python学习笔记17:标准库之数学相关(math包,random包)

前面几节看得真心累.如今先来点简单easy理解的内容. 一 math包 math包主要处理数学相关的运算. 常数 math.e   # 自然常数e math.pi  # 圆周率pi 运算函数 math.ceil(x)       # 对x向上取整.比方x=1.2,返回2 math.floor(x)      # 对x向下取整.比方x=1.2,返回1 math.pow(x,y)      # 指数运算.得到x的y次方 math.log(x)        # 对数.默认基底为e.能够使用base參

Python学习笔记17:标准库之数学相关(之math包,random包)

前面几节看得真心累,现在先来点简单容易理解的内容. 一 math包 math包主要处理数学相关的运算. 常数 math.e   # 自然常数e math.pi  # 圆周率pi 运算函数 math.ceil(x)       # 对x向上取整,比如x=1.2,返回2 math.floor(x)      # 对x向下取整,比如x=1.2,返回1 math.pow(x,y)      # 指数运算,得到x的y次方 math.log(x)        # 对数,默认基底为e.可以使用base参数,

python学习笔记4-数据类型-数字

数字类型:定义变量是不要加引号,加了引号会当作字符串处理 又包括int(整形)范围在-2147483648到2147482647之间 long(长整型)如果强制将一个整形变成长整型可以在定义变量时在最后加上一个l或L float(浮点型)即带小数 complex(复数型)定义时在数字最后面加上j,常用于抛物线 要查看数据的类型可以使用tpye()函数 字符串型(str):定义时加上引号,双引号可单引号都可以,一般情况下没有区别.只有当定义的字符串中间有个单引号(或双引号)最外面的引号应使用双引号

python学习笔记2—python文件类型、变量、数值、字符串、元组、列表、字典

python学习笔记2--python文件类型.变量.数值.字符串.元组.列表.字典 一.Python文件类型 1.源代码 python源代码文件以.py为扩展名,由pyton程序解释,不需要编译 [[email protected] day01]# vim 1.py #!/usr/bin/python        print 'hello world!' [[email protected] day01]# python 1.py hello world! 2.字节代码 Python源码文件

python基础教程_学习笔记17:标准库:一些最爱——time

标准库:一些最爱 time time模块所包含的函数能够实现以下功能: 获取当前时间.操作系统时间和日期.从字符串读取时间以及格式化时间为字符串. 日期可以用实数(从"新纪元"的1月1日0点开始计算到现在的秒数,新纪元是一个与平台相关的年份,对unix来说是1970年),或者是包含有9个整数的元组. 日期元组的字段含义 如元组: (2008,1,21,12,2,56,0,21,0) 表示2008年1月21日12时2分56秒,星期一,且是当年的第21天(无夏令时). 索引 字段 值 0

OpenCV之Python学习笔记

OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书<OpenCV Computer Vision with Python>,于是就看一遍,顺便把自己掌握的东西整合一下,写成学习笔记了.更需要的朋友参考. 阅读须知: 本文不是纯粹的译文,只是比较贴近原文的笔记:         请设法购买到出版社出版的书,支持正版. 从书名就能看出来本书是介绍在Pytho

Python学习笔记_Python对象

Python学习笔记_Python对象 Python对象 标准类型 其他内建类型 类型对象和type类型对象 Python的Null对象None 标准类型操作符 对象值的比较 对象身份比较 布尔类型 标准类型的内建函数 typeObj cmpobj1 obj2 strobj reprobj typeobj isinstanceobj 标准类型的分类 存储模型 更新模型 访问模型 不支持的类型 Python学习笔记_Python对象 首先来理解一个通俗的含义,什么是对象?其实对象无论在什么语言里面

python 学习笔记 14 -- 常用的时间模块之datetime

书接上文,前面我们讲到<常用的时间模块之time>,这次我们学习datetime -- 日期和时间值管理模块 使用apihelper 查看datetime 模块,我们可以看到简单的几项: date       ---  日期对象,结构为date(year, month, day) time       ---  时间值对象,结构为 time([hour[, minute[, second[, microsecond[, tzinfo]]]]]).时间对象所有的参数都是可选的.tzinfo 可以

python学习笔记[3]-邮件的发送

本文摘抄自:http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html 一.相关模块介绍 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍:    1.smtplib模块 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])   SMTP类构造函数,表示与SMTP服务器之间的连接,通过这个连接可以向smtp服务器发送指令,执行