动态类型

在我们接触的对象中,有一类特殊的对象,是用于存储数据的,常见的该类对象包括各种数字,字符串,表,词典。在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]

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

  1. (转)python学习笔记4--数字类型与操作符

    原文:https://blog.csdn.net/lemonwyc/article/details/37558269 1. 同时赋值(Simultaneous Assignments) python支 ...

  2. Python学习笔记1-数据类型

    数据类型: float — 浮点数可以精确到小数点后面15位 int — 整型可以无限大 bool — 非零为true,零为false list — 列表 Float/Int: 运算符: / — 浮点 ...

  3. Python学习笔记17—Tornado

    实例 #!/usr/bin/env Python #coding:utf-8 import tornado.httpserver import tornado.ioloop import tornad ...

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

    前面几节看得真心累.如今先来点简单easy理解的内容. 一 math包 math包主要处理数学相关的运算. 常数 math.e   # 自然常数e math.pi  # 圆周率pi 运算函数 math ...

  5. Python 学习笔记17 文本 - 读写

    在我们的编程过程中,我们经常需要对文件进行读写操作. 在Python中,对文本的读写非常的方便,只需要简单的几行代码就可以实现. 我们首先新建一个文本文件"Text.txt", 里 ...

  6. Python学习笔记:String类型所有方法汇总

    # 按字母表熟悉下string中的方法# A B C D E F G H I J K L M N O P Q R S T U V W X Y Z# 标红的为常用重点的方法!! str = " ...

  7. Python学习笔记:List类型所有方法汇总

    ###############################红色标红的部分为常用方法############################### import copy names = [&quo ...

  8. Python学习笔记.md

    Python学习笔记 1.变量类型 x=5 int x="ss" string x='a' string x=True bool #查看变量类型 type(x) 2.字符串常用操作 ...

  9. golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍

    golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍 go语言爬虫框架:gocolly/colly,goquery,colly,chrom ...

随机推荐

  1. Eclipse输入任意字母或指定字符出现提示框

    Eclipse默认是输入"."的时候会有提示框提示对应的API. 如果想更方便的输入任意字母或者指定的符号出现提示框设置如下: 打开Eclipse,选中“Window”->& ...

  2. [ImportNew]Java线程面试题

    Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发.调试.优化经验,所以线程相关 ...

  3. Wince 中的图形编程

    图形编程程序当中,笔者主要要和大家讨论的是画刷的创建和使用以及绘图函数,比如2D图像的绘制等等. *画刷的定义: HBRUSH hBrush; *画刷的类型: 1. 系统内置画刷:GetStockOb ...

  4. 原生js 实现的瀑布流

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  5. spark RDD的元素顺序(ordering)测试

    通过实验发现: foreach()遍历的顺序是乱的 但: collect()取到的结果是依照原顺序的 take()取到的结果是依照原顺序的 为什么呢???? 另外,可以发现: take()取到了指定数 ...

  6. Unity3D除了在编辑器里,怎么用代码给一个Texture类型的变量赋值

    resource.load上来一张贴图就行. using UnityEngine; using System.Collections; public class example : MonoBehav ...

  7. UITableView的编辑模式

    UITableView可以分普通模式和Editing模式两种,这里我们着重讨论Editing模式,Editing模式中又分三种操作:Insert.Delete. Reallocted.Insert和D ...

  8. 相似度到大数据查找之Mysql 文章匹配的一些思路与提高查询速度

    文章相关度匹配的一些思路---"压缩"预料库,即提取用特征词或词频,量化后以“列向量”形式保存到数据库:按前N组词拼为向量组供查询使用,即组合为1到N字的组合,量化后以“行向量”形 ...

  9. C# 高精度加法 支持小数(待优化)

    直接上代码 实现思路: 1.首先小数点补 位,9223372036854775808.9+9223372036854775808.9223372036854775808 => 922337203 ...

  10. ZigBee组网原理

    Zigbee组建一个完整的网络包含两个步骤:网络初始化和节点加入网络.其中,节点加入网络可以分为通过协调器直接连接入网和通过已有父节点入网.下面来依次说明. 1. 网络初始化 ZigBee网络初始化只 ...