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

来源:互联网 发布:java web登录次数限制 编辑:程序博客网 时间:2024/05/16 00:50
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 = AB = "shrubbery"2.思考下面三条语句。它们会改变A的值吗?A = ["spam"]B = AB[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的列表对象。

0 0
原创粉丝点击