文档章节

python学习手册:学习笔记4--The Dynamic Typing Interlude

fzyz_sb
 fzyz_sb
发布于 2015/02/14 22:03
字数 1104
阅读 50
收藏 0
点赞 0
评论 0

    对于Python来说,当写下:

a = 3
时候,Python如何知道a是代表一个整型呢?实际上Python并不知道,但是Python是运行时候自动进行匹配的,所以运行时候就知道a是整型.这跟C++的RTTI差不多,类似模板的技术.

变量,对象和引用

    变量通常关联三个步骤:1.变量创建,当你第一次对变量进行赋值时候,变量被创建(非赋值而使用变量,则会产生异常). 2.变量类型,变量通常是没有类型的,它关联到整型,则它就是整型,它关联到字符串型,则它就是字符串型. 3.变量使用,只要变量被赋值,那么它就可以被使用.

    但是这里有一个至关重要的概念:引用

>>> a = 3
>>> id(a)
33120312L
>>> a = 4
>>> id(a)
33120288L
    这里a = 3,实际上是将变量a指向了 对象3,而如果我们重新给a赋值4,则会发现其id已经改变(因为3和4是不同的两个对象).可形象化的表示如下:

可用以下三个步骤解释上图:

1. 变量进入系统表,用于存储一个链接指向对象.

2. 对象存在于所分配的内存中.

3. 引用自动关联其变量和对象.

类型存活于对象之中,而非变量

    我们可以使用如下的代码轻而易举的说明:为什么类型存活于对象之中,而非变量:

>>> a = 3
>>> id(a)
33120312L
>>> a = 'spam'
>>> id(a)
39014152L
>>> a = 1.23
>>> id(a)
35872888L
对象是垃圾收集的

    Python是使用引用计数方式来进行垃圾收集.例如上例中当a重新被赋值'spam'时候,由于对象3的引用计数从1到0(给a赋值3时候3的引用计数加1),所以自动进行了垃圾回收.

    但是有个问题是:如果Python中发生,两个对象互相引用,那么引用计数的方式是否会失效?还是Python本身也可以使用"离开作用域则对象失效"的垃圾收集方式.

    这确实无法避免(互相引用),所以有些Python实现使用了"离开作用域则进行变量销毁"的垃圾收集机制.

共享引用

    当我们执行以下代码的时候,就产生了对象的共享:

>>> a = 3
>>> b = a
>>> id(a), id(b)
(33120312L, 33120312L)
用流程图表示如下:

    但是,当我们执行以下代码的时候,对象改变了:

>>> a = 3
>>> b = a
>>> a = 'spam'
>>> id(a), id(b)
(41457024L, 33120312L)

流程图如下:

这里我们是将a指向了新的对象.但是如果a和b本身所指向的对象是可改变的,则会产生Python中著名的"浅拷贝和深拷贝"问题:

>>> person = ["name", ["savings", 100.00]]
>>> hubby = person[:]
>>> wifey = list(person)
>>> [id(x) for x in (person,hubby,wifey)]
[40895560L, 40894920L, 40889032L]
>>> hubby[0] = "joe"
>>> wifey[0] = "jane"
>>> hubby, wifey
(['joe', ['savings', 100.0]], ['jane', ['savings', 100.0]])
>>> hubby[1][1] = 50.00
>>> hubby, wifey
(['joe', ['savings', 50.0]], ['jane', ['savings', 50.0]])
    而一般这时候,我们需要的是深拷贝:
>>> person = ["name", ["savings", 100.00]]
>>> hubby = person
>>> import copy
>>> wifey = copy.deepcopy(person)
>>> [id(x) for x in (person, hubby, wifey)]
[40889608L, 40889608L, 40863624L]
>>> hubby[0] = "joe"
>>> wifey[0] = "jane"
>>> hubby, wifey
(['joe', ['savings', 100.0]], ['jane', ['savings', 100.0]])
>>> hubby[1][1] = 50.00
>>> hubby, wifey
(['joe', ['savings', 50.0]], ['jane', ['savings', 100.0]])
备注:所谓的深拷贝,就是不同对象具有相同的值而已(值的对象也不同)

共享引用和相等

    对于垃圾回收来说,如果回收的对象不可改变(如整型,集合,字符串等等,这里以42举例),则Python解释器一般不回收,而让42一直存在于系统表中直到重新被赋值.

    Python中有两种判断的方法:==和is.==等于号用于判断两个对象的值是否相等,而is用来判断两个对象是否属于同一个对象类型:

>>> L = [1, 2, 3]
>>> M = L
>>> L == M
True
>>> L is M
True
    但是,当L和M指向不同的可改变对象时候,情况就不一样了:
>>> L = [1, 2, 3]
>>> M = [1, 2, 3]
>>> L == M
True
>>> L is M
False
    而下列代码恰恰说明了不可改变对象通常并没有被回收:
>>> X = 42
>>> Y = 42
>>> X == Y
True
>>> X is Y
True
    而我们可以通过方法getrefcount来查看对象被引用的次数:
>>> import sys
>>> sys.getrefcount(42)
13


© 著作权归作者所有

共有 人打赏支持
fzyz_sb
粉丝 404
博文 209
码字总数 447144
作品 0
武汉
程序员
荐书丨确认过眼神,这份Python书单一定是你的菜

点击上方“程序人生”,选择“置顶公众号” 第一时间关注程序猿(媛)身边的故事 Python 是军刀型的开源工具,被广泛应用于Web 开发、爬虫、数据清洗、自然语言处理、机器学习和人工智能等方...

csdnsevenn ⋅ 05/05 ⋅ 0

推荐几本对于Python初学者比较好的书籍(内含PDF)

我们提供一个初学者最好的Python书籍列表。Python是一个初级程序员可以学习编程的最友好语言之一。为了帮助您开始使用Python编程,我们分享此列表。泡一杯茶,选一本书阅读,开始使用Python编...

柯西带你学编程 ⋅ 06/08 ⋅ 0

利用python函数的输入、输出定义与时序图相结合,让生活更有趣

写在前面 1. 重点是思路交流,利用python函数的输入、输出定义与时序图相结合,让流程更加的简洁、清晰。该方法不局限于工作,同样适用于学习笔记、恋爱心得...等等只要存在个体交互的活动。...

python达人 ⋅ 05/08 ⋅ 0

程序员必备,快速学习 Python 的全套14张思维导图(附高清版下载)

后台回复关键词 思维导图 可获取本文中的高清思维导图(PDF版) ML & AI∣一个有用的公众号 长按,识别二维码,加关注 获取更多精彩文章

micf435p6d221ssdld2 ⋅ 05/23 ⋅ 0

分享一些关于数据分析的学习资料

时间过得真快,转眼一周又要过去了。这一周里你读了什么书?学到了什么知识?有什么收获? 这周里,我收集到一些关于Python数据分析的学习资料,在这里一并分享给大家: Python数据分析班升级...

爱吃西瓜的番茄酱 ⋅ 05/13 ⋅ 0

2018年4月下载中心资源下载TOP榜

2018年4月1日至4月30日下载中心资源下载TOP榜 A、系统运维 NO.1 下载数:716 资源标题:Windows Server 2016管理员操作手册 资源地址:http://down.51cto.com/data/2445174 NO.2 下载数:486...

51CTO下载 ⋅ 05/02 ⋅ 0

她们不一样!python小白刚学会python竟然爬取了网上所有小姐姐的照片

如今想学python的人越来越多,无论是专业的程序员还是业余爱好者,都对python情有独钟。世界上值得学习的技能有很多,但是如果你要问我推荐哪一个,那么我会推荐一门编程语言,比如python。如...

Python学习 ⋅ 06/06 ⋅ 0

R语言构建层次分析模型不看一下吗~

作者简介 杜雨,EasyCharts团队成员,R语言中文社区专栏作者,兴趣方向为:Excel商务图表,R语言数据可视化,地理信息数据可视化。 个人公众号:数据小魔方(微信ID:datamofang) ,“数据小...

R语言中文社区 ⋅ 05/13 ⋅ 0

良心推荐:一份20周学习计算机科学的经验贴(附资源)

雷锋网按:这里是,油管Artificial Intelligence Education专栏,原作者Siraj Raval授权雷锋字幕组编译。 原标题 Computer Science Curriculum 翻译 | 王飞 整理 | 凡江 这是一份五个月(20个...

雷锋字幕组 ⋅ 05/08 ⋅ 0

一个月入门Python爬虫,快速获取大规模数据

数据是创造和决策的原材料,高质量的数据都价值不菲。而利用爬虫,我们可以获取大量的价值数据,经分析可以发挥巨大的价值,比如: 豆瓣、知乎:爬取优质答案,筛选出各话题下热门内容,探索...

Python开发者 ⋅ 04/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

思路分析 如何通过反射 给 bean entity 对象 的List 集合属性赋值?

其实 这块 大家 去 看 springmvc 源码 肯定可以找到实现办法。 因为 spirngmvc 的方法 是可以 为 对象 参数里面的 list 属性赋值的。 我也没有看 具体的 mvc 源码实现,我这里只是 写一个 简...

之渊 ⋅ 33分钟前 ⋅ 0

vim使用手册--配对括号的查找

1、把光标放在标记有(、[或{处。 2、按%字符 3、此时光标的位置应当在配对的括号处 4、再次按%就可以跳回配对的第一个括号处。

dragon_tech ⋅ 37分钟前 ⋅ 0

c++ 、object-c printf,%02X和%x有什么区别 ?

%x即按十六进制输出,英文字母小写,右对齐。 %02X有以下变化:英文字母变大写,如果输出字符不足两位的,输出两位宽度,右对齐,空的一位补0。超过两位的,全部输出。 如果不用 %02x 会出现...

yizhichao ⋅ 42分钟前 ⋅ 0

Spring源码解析(七)——实例创建(中)

前言 上一节讲到了,Spring 会根据实例的作用域执行不同的创建逻辑,分别是 Singleton、Prototype、其他 Scope,其中 Singleton 会调用 getSingleton 从缓存中获取,缓存中没有才会创建实例;...

MarvelCode ⋅ 42分钟前 ⋅ 0

Thrift RPC实战(六) spring集成thrift

1.服务端设置 对泛型Thrift Service的支持, 通过采用spring配置以及反射的方式来实现.对于一个服务提供者来说,需要提供端口,接口以及接口实现类,因此在接口中spring配置文件中配置如下 <!...

lemonLove ⋅ 44分钟前 ⋅ 0

oracle11g自动分区使用

为什么使用自动分区? 在oracle11g之前,oracle是不支持自动分区功能的,这就可能导致我们系统在运行一段时间之后,就需要看看分区是否创建或者写触发器进行创建分区,否则就会导致数据无法入...

strict_nerd ⋅ 56分钟前 ⋅ 0

Spring mvc ViewResolver视图解析器实现机制

概要 我们在controller里面经常这样return一个ModelAndView。 return new ModelAndView("userList", "users", userList); DispatcherServlet 靠 ViewResolver 把 userList 解析为 /WEB-INF......

轨迹_ ⋅ 今天 ⋅ 0

策略模式

1.策略模式 策略模式是同一个行为的不同处理办法。策略模式和简单工厂模式的区别:1.策略模式主要是方法的执行方式,工厂模式要获取的对象。两者的侧重点不同。 ...

Cobbage ⋅ 今天 ⋅ 0

行政区划代码转为字典形式

原数据为: http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/201804-06041553.html 手动替换了一下格式,并使用下面的代码处理. # 输入格式s = """110000:北京市110101:东城区1101...

漫步海边小路 ⋅ 今天 ⋅ 0

android apk 签名

创建key,需要用到keytool.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),使用产生的key对apk签名用到的是jarsigner.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),把...

国仔饼 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部