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的列表对象。
时间: 2024-10-03 23:28:34