码迷,mamicode.com
首页 > 编程语言 > 详细

python笔记2 python对象的动态类型

时间:2016-04-29 17:07:10      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

Python中的一切都是对象,并且这些对象都是Python的组成部分,即是内置对象,和python一同产生。
从更正式的角度来讲,在P ython中,数据以对象的形式出现一一无论是Py t hon提供的内置对象,还是使用Python或是像C扩展库这
样的扩展语言工具创建的对象。尽管在以后才能确定这一概念,但对象无非是内存中的一部分,包含数值和相关操作的集合。

内置对象

对象类型		例子常量/创建

数字                    1234, 3.1415, 3+4j, Decimal. Fraction
字符串			'spam' , "guido's" , b'a 飞xolc'
列表			[1 , [2, 'three'] , 4]
字典			{'food' :'spam' , 'taste' :'yum'}
元组			(1, ' spam' , 4, 'U')
文件			myfile=open('eggs ' , γ)
集合			set (' abc ' ) , {' a " 'b' , 'c'}
其他类型		类型、None 、布尔型
编程单元类型		函数、模块、类(参见第四部分、第五部分和第六部分)
与实现相关的类型	编译的代码堆梭跟踪
		

同等重要的是,一旦创建了一个对象,它就和操作集合绑定了一一只可以对字符率进行字符串相关的操作,对列表进行列表相关的操

作。就像你将会学到的. Python是动态类型的(它自动地跟踪你的类型而不是要求声明代码) .但是它也是强类型语言(你只能
对一个对象进行适合该类型的有效的操作)。

数字,字符串这些在python中都是对象存在,一旦创建了一个对象,那么与它相关的操作(对象的方法调用)就绑定了。


python 的动态类型

动态类型是P yt h o n语言灵活性的根源。

缺少类型声明语旬的情况
如果你有学习静态编译类型语言C 、C++或J ava的背景,学到这里,你也许会有些困惑。到现在为止,我们使用变量时,都没有声明
变量的存在和类型,但变量还可以工作。例如,在交互会话模式或是程序文件中,当输入a = 3时. Python怎么知道那代表丁一个整
数呢?在这种情况下. Python怎么知道a是什么?

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

变量a 随着它的值的改变,其类型在改变。

>>> a=3
>>> type(a)
<class 'int'>
>>> a='cc'
>>> type(a)
<class 'str'>
>>> print(a)
cc
>>> a=10
>>> print(a)
10
>>> 


变量创建
一个变量(也就是变量名) ,就像a ,当代码第一次给它赋值时就创建了它。之后的赋值将会改变已创建的变量名的值。从技术上来讲
, Python在代码运行之前先检测变量名,可以当成是最初的赋值创建变量。
变量类型
变量永远不会有任何的和它关联的类型信息或约束。类型的概念是存在于对象中而不是变量名中。变量原本是通用的,它只是在一个
特定的时间点,简单地引用了一个特定的对象而已。
变量使用
当变量出现在表达式中肘,它会马上被当前引用的对象所代替,无论这个对象是什么类型。此外,所有的变量必须在其使用前明确地
赋值,使用未赋值的变量会产生错误。


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

例如,当我们这样说时:
>>> a = 3
至少从概念上来说, P ython将会执行三个不同的步骤去完成这个请求。这些步骤反映了
Python 语言中所有赋值的操作:
1  创建一个对象来代表值3 。
2. 创建一个变量a ,如果它还没有创建的话。
3. 将变量与新的对象3相连接。

实际的效果是如图所示的一个在Python中的内部结构。如图所示,变量和对象保存在内存中的不同部分,并通过连接相关联(这个连接
在图中显示为一个箭头)。变量总是连接到对象,并且绝不会连接到其他变量上,但是更大的对象可能连接到其他的对象(例如, 一个
列表对象能够连接到它所包含的对象) 。


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


在Python 中从变量到对象的连接称作引用。也就是说,引用是一种关系,以内存中的指针的形式实现 。一且变量被使用(也就是说被
引用) , Pyth on 自动跟随这个变量到对象的连接。这实际上比术语所描述的要简单得多。以具体的术语来讲:

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


从技术上来讲,对象有更复杂的结构而不仅仅是有足够的空间表示它的值那么简单。每一个对象都有两个标准的头部信息: 一个类型
标志符去标识这个对象的类型,以及一个引用的计数器,用来决定是不是可以回收这个对象。


类型属于对象,而不是变量
为了理解对象类型是如何使用的,请看当我们对一个变量进行多次赋值后的结果:
>>> a = 3 # 11'S an inleger
>>> a = 'spam' # NolV il'S a slring
>>> a = 1.23 # Now ir's (1 jloaring poinr


在P ython 中,情况很简单:变量名没有类型。就像前边所说的,类型属于对象,而不是变量名。就之前的例子而吉,我们只是把a修
改为对不同的对象的引用。因为变量没有类型,我们实际上并没有改变变量a 的类型,只是让变量引用了不同类型的对象而已。实际
上, Python的变量就是在特定的时间引用了一个特定的对象。


注意PythOD 中的类型是与对象相关眠的,而不是和变量关联。在典型的代码中, 一个给定的变量往往只会引用一种类型的对象。尽
管这样,因为这并不是必须的,你将会发现Python代码比你通常惯用的代码更加灵活: 如果正确的使用Python ,代码能够自动以多
种类型进行工作。


对象的两个头部信息, 一个是类型标志符,另一个是引用计数器。为了了解后者,我们需要继续学习下面内容, 并简要地介绍对象
生命结束时发生了什么变化。

一下这些内容 编写一些代码即可明白。
对象的垃圾收集
共享引用
共享引用和在原处修改
共享引用和相等


1.思考下面三条语句。它们会改变A打印出的值吗?
A = "spam"
B = A
B = "shrubbery"


2.思考下面三条语句。它们会改变A的值吗?

A = ["spam"]
B = A
B[0] = "shrubbery"


3.思考下面三条语句。它们会改变A的值吗?

A = ["spam"]
B = A[:]
B[0] = "shrubbery"


1.不: A仍会作为"p a m"进行打印。当B赋值为字符串"shrubbery" 时, 所发生的只是变量B 被重新设置为指向了新的字符串对象。

A和B最初共享(即引用或指向)了同一个字符串对象"spam" , 但是在Python 中这两个变量名从未连接在一起。
因此,设置B为另一个不同的对象对A没有影响。如果这里最后的语句变为B = B+ 'shrubbery' ,也会发生同样的事情。另外,合并操
作创建了一个新的对象作为其结果,并将这个值只赋值给了B。我们永远都不会在原处覆盖一个字符串(数字或元组) ,因为字符串是
不可变的。


2 .是: A现在打印为["shrubbery"] 。从技术上讲,我们既没有改变A也没有改变B ,我们改变的是这两个变量共同引用(指向)的
对象的一部分,通过变量: B在原处覆盖了这个对象的一部分内容。因为A像B一样引用了同一个对象,这个改变也会对A产生影响。


3 .不会: A仍然会打印为["pam"] 。由于分片表达式语句会在被赋值给B前创建一个拷贝,这次对B在原处赋值就不会有影响了。在第
二个赋值语句后,就有了两个拥有相同值的不同列表对象了(在Python 中,我们说它们是--的,却不是is的)。第三条赋值语句会改变
指向B的列表对象,而不会改变指向A的列表对象。

python笔记2 python对象的动态类型

标签:

原文地址:http://blog.csdn.net/yejinxiong001/article/details/51253968

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!