《python学习手册》笔记1--动态类型

转载请注明: TheViper http://www.cnblogs.com/TheViper  

变量,对象和引用

在python中,类型是在运行过程中自动决定的,而不是通过代码声明。这意味着没有必要事先声明变量。

a=3解析的过程:

  1. 变量创建:这里的变量a,当代码第一次给它赋值时就创建了它,之后的赋值将会已创建的变量的值。
  2. 变量类型:变量永远不会有任何和它关联的类型信息或约束。类型的概念存在于对象中而不是变量。变量原本是通用的,它只是在一个特定的时间点,简单的引用了一个特定的对象而已。
  3. 变量使用:当变量出现在表达式中,它马上被当前引用的对象所替代,无论这个对象是什么类型。注意,所有变量必须在其使用前明确的赋值。

总之,变量在赋值的时候才创建,它可以引用任何类型的对象,并且必须在引用前赋值。

上面的代码的赋值操作:

  1. 创建一个对象(这里是数字)代表值3.
  2. 创建一个变量a,如果它还没有创建的话。
  3. 将变量与新对象3连接。

如上图所示,变量和对象保存在内存的不同部分,它们通过连接相关联(图中箭头)。

具体的,在运行a=3后,变量a变成对象3的一个引用。在内部,变量事实上是到对象内存空间(通过运行常量表达式3创建)的一个指针。

以具体的术语来讲,

  • 变量是系统表的元素,拥有指向对象的连接空间。
  • 对象是分配的一块内存,有足够的空间表示它所代表的值。
  • 引用是自动形成的从变量到对象的指针。

事实上,python并不是对创建的所有对象都会重新申请新的一块内存空间。作为一种优化,python会缓存不变的对象(如数值较小的数字,字符串,元组等)并对其进行复用。

类型属于对象,而不是变量

a=3
a=‘viper‘
a=1.333

变量a刚开始是整数,然后是字符串,最后是浮点数,但是这段代码可以运行。这是因为,在python中,情况很简单,变量名没有类型。

上面的代码,我们只是把变量a修改为对不同对象的引用,从而让变量a引用了不同类型的对象而已。

共享引用

a=3
b=a

可以看到变量a,b引用了同一个对象。这时,让变量a引用另一个对象。

a=3
b=a
a=‘viper‘

a=‘viper‘创建了一个新的对象‘viper’,并让变量a对这个新对象引用,而变量b仍然引用原来的对象3.所以这时变量b的值是3.

共享引用和在原处修改

有一些对象和操作确实会在原处改变对象,例如,在一个列表中对一个偏移赋值就会改变这个列表对象,而不是生成一个新的列表对象。对于这种可以在原处修改的对象,共享引用的时候要小心,因为对一个变量名的修改会影响其他和它引用同一对象的变量。

L1=[1,2,3]
L2=L1
L1[0]=33

这时变量L1,L2的值都会变成[33,2,3].

这种行为通常不是我们想要的,但是这种行为是默认的,如果不想这种行为发生,就需要拷贝对象,而不是创建引用。

L1=[1,2,3]
L2=L1[:]
L1[0]=‘viper‘
print(L2)# [1,2,3]

因为L2引用的是L1引用对象的一个拷贝,这里两个变量指向不同的内存区域。所以L1的改变不会影响L2.

注意上面用到了分片,其他的有些可变的核心类型(如字典,集合)不能分片,这时就使用copy()方法。

共享对象和相等

由于python的引用模型,在python程序中有两种不同的方法检查是否相等。==和is

==检查两个被引用的对象是否拥有相同的值,这种方法被用作相等的检查。

is会比较实现引用的指针,是检测共享引用的一种方法。如果变量的引用值相等,但是是不同的对象,那is就返回false.比如,

变量M和L虽然值相同,但它们两个不同的对象,在不同的内存区域。

另外

这个验证了前面说的 python会缓存不变的对象(如数值较小的数字,字符串,元组等)并对其进行复用。y=3只是让变量y引用已经创建的对象3.

时间: 2024-11-05 21:08:06

《python学习手册》笔记1--动态类型的相关文章

Python学习手册笔记

之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我在这里推荐了几篇文章,有其他语言编程经验的人简单看一看就可以很快地开始编写Python程序了. 黑体表示章节, 下划线表示可以直接在原文对应位置查到的专有技术名词. 原书配套答案请到http://www.hzbook.com/Books/4572.html下载,简单注册即可. 第三章 如何运行程序 impor

Python学习手册笔记(1):Python对象类型

在Python中一切皆对象,Python程序可以分解为模块.语句.表达式及对象.如下所示: 1 程序由模块组成 2 模块包含语句 3 语句包含表达式 4 表达式建立并处理对象 内置对象(核心类型): 1)数字: >>> 2+2            #整数加法 4 >>> 1.5*4          #浮点数乘法 6.0 >>> 2**10          #2的10次方 1024 2) 字符串: >>> s='abcdefg'

Python学习手册笔记——管理属性

管理属性有四种方式:1.__getattr__和__setattr__:把未定义的属性获取和所有的属性赋值指向通用的处理器方法. 2.__getattribute__:把所有的属性获取和赋值指向Python2.6中的新式类和Python 3.0中的所有类的中的一个处理器方法 3.property内置函数,把特定属性访问定位到get和set函数,也叫做特性 4.描述符:把特定属性访问定位到具有任意get和set函数的类的实例 特性 attribute = property(fget, fset,

《Python学习手册》读书笔记【转载】

转载:http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html 之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我在这里推荐了几篇文章,有其他语言编程经验的人简单看一看就可以很快地开始编写Python程序了. 黑体表示章节, 下划线表示可以直接在原文对应位置查到的专有技术名词. 原书

Python学习入门笔记(一):Python文件类型

1.源代码 扩展名:.py,由Python程序解释,不需要编译. --创建hello.py源文件 # cat hello.py  print 'Hello World!' --执行hello.py [[email protected] study]# chmod a+x hello.py  [[email protected] study]# python hello.py  Hello World! [[email protected] study]# ./hello.py  ./hello.

python学习手册——1介绍python对象类型

在python ,数据以对象的形式出现--无论是python提供的内置对象,还是使用python或是像C扩展库这样的扩展语言工具创建的对象.尽管在以后才能确定这一概念,但对象无非是内在中的一部分,包含数值和相关操作的集合. 由于对象是python 最基本的概念,从这一章开始我们将会全面地体验python的内置对象类型. python程序可以分解成模块,语句,表达式以及对象,如下所示: 1.程序由模块构成 2.模块包含语句 3.语句包含表达式 4.表达式建立并处理对象 为什么使用内置类型 1.内置

《Python 学习手册》笔记 1

今天看了 Udacity 的 iOS 学习路线介绍,作者的看法是,最好先学习 Swift,而不是 Objective-C,原因一方面是 Swift 要简单一些,另一方面是因为 Apple 打算用 Swift 作为将来的官方语言取代 OC. 大学里,编程语言课程就是 C 和 C++.我不知道这是谁定的,也许他们有足够充分的理由.但是对于大多数人来说,这两个语言——一个太底层,一个太复杂)其实不见得那么重要.还不如学学 Ruby 和 Python 这样的抽象度更高的解释性语言,易于使用,而且内置了强

《Python学习手册 第五版》 -第16章 函数基础

前面的章节讲解的是一些基础数据类型.基本语句使用和一些文档查看的内容,这些都是一些基础,其实还谈不上入门,只有了解了函数,才算入门 函数是编程里面使用最多的也是最基本的程序结构, 本章重点内容 1.函数 1)什么是函数? 2)为什么使用函数? 2.编写函数 1)函数的基本格式 2)定义和调用函数 3)函数的多态.局部变量 接下来针对本章重点,展开详细的说明 1.函数 1)什么是函数? 这里没有严格的定义,用通俗易懂的方式来说: 函数就是将一些语句集合在一起的组件,从而让他们能够不止一次的在程序中

python学习手册中的一些易忘的点(4-7部分)

有时间系统看一遍python学习手册,记录一些易忘点 1.python函数高聚合低耦合1)对于输入使用参数并且对于输出使用return2)只有在真正必要的情况下使用全局变量3)不要改变可变类型的参数,除非调用者希望这样做4)每个函数都应该有一个单一的.统一的目标5)每一个函数应该相对较小6)避免直接改变在另一个文件中的变量 2.递归处理任意结构>>> a=[3,[2,[2,3,4],2],1,[1,5,[1,3,3]]]>>> def sumtree(L):...  

读书分享全网学习资源大合集,推荐Python学习手册等三本书「01」

0.前言 在此之前,我已经为准备学习python的小白同学们准备了轻量级但超无敌的python开发利器之visio studio code使用入门系列.详见 1.PYTHON开发利器之VS Code之初识.简介.安装.中文 2.PYTHON开发利器之VS Code 主题.界面美化.快捷键.编辑器技巧 3.PYTHON开发利器之VS Code 常用插件介绍 4.PYTHON开发利器之使用VS Code进行python程序开发 5.1.PYTHON开发利器之使用VS Code+Git进行python