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]
python学习笔记17(动态类型)的更多相关文章
- (转)python学习笔记4--数字类型与操作符
原文:https://blog.csdn.net/lemonwyc/article/details/37558269 1. 同时赋值(Simultaneous Assignments) python支 ...
- Python学习笔记1-数据类型
数据类型: float — 浮点数可以精确到小数点后面15位 int — 整型可以无限大 bool — 非零为true,零为false list — 列表 Float/Int: 运算符: / — 浮点 ...
- Python学习笔记17—Tornado
实例 #!/usr/bin/env Python #coding:utf-8 import tornado.httpserver import tornado.ioloop import tornad ...
- Python学习笔记17:标准库之数学相关(math包,random包)
前面几节看得真心累.如今先来点简单easy理解的内容. 一 math包 math包主要处理数学相关的运算. 常数 math.e # 自然常数e math.pi # 圆周率pi 运算函数 math ...
- Python 学习笔记17 文本 - 读写
在我们的编程过程中,我们经常需要对文件进行读写操作. 在Python中,对文本的读写非常的方便,只需要简单的几行代码就可以实现. 我们首先新建一个文本文件"Text.txt", 里 ...
- 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 = " ...
- Python学习笔记:List类型所有方法汇总
###############################红色标红的部分为常用方法############################### import copy names = [&quo ...
- Python学习笔记.md
Python学习笔记 1.变量类型 x=5 int x="ss" string x='a' string x=True bool #查看变量类型 type(x) 2.字符串常用操作 ...
- golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍
golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍 go语言爬虫框架:gocolly/colly,goquery,colly,chrom ...
随机推荐
- 【最短路】ACdream 1198 - Transformers' Mission
Problem Description A group of transformers whose leader is Optimus Prime(擎天柱) were assigned a missi ...
- Ubuntu下用SecureCRT连接串口/dev/ttyUSB0权限修复
在普通用户的模式下,用SecureCRT链接串口交换机,开始会提示/dev/ttyUSB0权限不足,无法打开,临时的解决办法是 chmod 0+rw /dev/ttyUSB0 但是这个重启后便没了作用 ...
- 转:java服务器安全指南
转: http://drops.wooyun.org/web/16609 JAVA安全之JAVA服务器安全漫谈 z_zz_zzz · 2016/06/08 10:50 0x00 前言 本文主要针对JA ...
- git 一个文件还原到某个提交的commit
git checkout ${commit} /path/to/file 参考文献中1的参考链接中的git-checkout(1) Manual Page 中的Name: git-checkout - ...
- LoadRunner 如何进行接口的压力测试
主要压测的时候需要开发提供相关接口文档,或者自己录制.左侧的Name都是开发提供的接口参数名称,Value是相应的参数值.Action为开发给的测试地址.PS:注意在测试的时候设置Controller ...
- 参数请求post, get , delete中的基本使用(2)
UTF-8数字编码 /// <summary> /// 参数的Url请求 /// </summary> /// <returns></returns> ...
- jQuery之渐变切换
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- AjaxPro使用方法
无意中看到同事用AjaxPro用,看到很不错,特长是前后台传输数据特别方便. 最好的教材就是拿到就可以用,方便大家. 以前数据传输用FORM提交,或者在前台用JASON拼接然后通过AJAX方式提交.总 ...
- Python Quick Start
1.安装Python 官网下载python: https://www.python.org/ 有2.x 3.x版本, 注意,python3.0不向下兼容2.x版本,有很多包3.0不提供 下载完后直接点 ...
- 20141015--for语句1
for 语句 break (跳出循环体) 100节楼梯,第1-49节分数等于节数,50以后(包括50)每节10分,