文档章节

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

fzyz_sb
 fzyz_sb
发布于 2015/02/14 22:03
字数 1104
阅读 51
收藏 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
粉丝 408
博文 209
码字总数 447144
作品 0
武汉
程序员
Python系列英文原版电子书

【专题推荐】Python系列英文原版电子书 http://down.51cto.com/zt/104 python简明教程(CHM) http://down.51cto.com/data/49213 Linux黑客的python编程之道【pdf】推荐 http://down.51cto.co...

best_raven
2015/08/21
0
0
80个Python经典资料(教程+源码+工具)汇总——下载目录

大家好,51CTO下载中心根据资料的热度和好评度收集了80个Python资料,分享给Python开发的同学。内容包括1个Python专题、66个学习资料、7套Python源码和6个相关软件。附件较多,无法一一分享,...

icheer
2012/07/02
0
0
map,filter,reduce的应用方法

最近在自学python,不知道怎么入手,就花了好几十大洋买了《python学习手册》来看,记忆力不好,怕以后忘记了,写下来当是笔记吧。也可以供那些python新手又没买这本书的人做参考哈~ 1.map把第...

Geomen
2012/02/27
0
0
荐书丨确认过眼神,这份Python书单一定是你的菜

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

csdnsevenn
05/05
0
0
慕课网Spark SQL日志分析 - 5.DateFrame&Dataset

5.DateFrame&Dataset 1.DateFrame产生背景 DataFrame 不是Spark Sql提出的。而是在早起的Python、R、Pandas语言中就早就有了的。 Spark诞生之初一个目标就是给大数据生态圈提供一个基于通用语...

Meet相识_bfa5
07/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

180.mariadb 主从复制

参考:https://blog.csdn.net/chengxuzaza/article/details/62042920 睡觉睡觉,明天写 1.效果 当主库中数据有变化的时候,从库就自动同步 2. 环境要求 至少两台 linux服务器 (教程:https...

Lucky_Me
11分钟前
0
0
erlng file id3v1 id3v1.1

%% ---%% Excerpted from "Programming Erlang",%% published by The Pragmatic Bookshelf.%% Copyrights apply to this code. It may not be used to create training material, %% ......

xueyuse0012
12分钟前
0
0
RabbitMq的安装

环境Centos6.5 32位 JDK 1.7.8 Jdk的卸载 rpm -qa|grep jdk yum –y remove 上边的安装包 JDK的安装 Rpm –ivh jdk安装包 配置环境变量 export JAVA_BIN=/usr/java/jdk1.7.0_80/bin export J......

DemonsI
16分钟前
0
0
http和https协议

HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer,中文含义为“超文本传输协议在安全加密字层”,简单来说就是加密数据传输,通俗的说就是安全连接。 HTTPS安全超文本传输...

寰宇01
22分钟前
0
0
vue内引入语音播报功能

在vue项目中引入语音播报,使用的科大讯飞语音接入, 具体思路为每次接收到语音信息后存入一个数组,然后监听这个数组,开始冲第一个索引播放,并且同时根据vuex getter 来动态删减数量 给a...

originDu
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部