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

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

python笔记2 python对象的动态类型的相关文章

C#学习笔记(十一):动态类型

C#是一门静态类型的语言,但是在C#4.0时微软引入了动态类型的概念. dynamic 关键字dynamic用来定义动态对象,我们来看一下动态类型的一些特性. 调用不同类的相同方法 我们有两个或多个不相关的类,然后运行时需要可以调用到相同名称的方法,如下: 1 using System; 2 3 namespace Study 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 dynamic obj = GetObje

Python笔记3#Python函数式编程

▲函数式编程Function Programming 函数时Python内建支持的一种封装.我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. 函数式编程也可以归结到面向过程的程序设计,但它的思想更接近数学计算. 函数式编程就是一种抽象度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量. 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回另一个函数. Py

【python笔记】python中的list、tuple、set、dict用法简析

list list是一种有序的集合(或称作列表),可以很方便地添加和删除其中的元素. >>> classmates = ['Michael', 'Bob', 'Tracy'] 可通过序号访问各元素,序号范围:-n ~ n-1,当索引超出了范围时,Python会报一个IndexError错误 append(...)新增元素:classmates.append('Miranda') insert(... , ...)插入元素到指定位置:classmates.insert(2,'John')

Python笔记2#Python高级特性(Slice,Iteration, List Comprehensions,Generator)

▲切片Slice 在很多编程语言中,针对字符串提供了很多截取函数,其实目的就是对字符串进行切片.Python没有针对字符串的截取函数,只需要切片一个操作就能完成.Python切片非常灵活,一行代码就可以实现很多行循环才能完成的操作.示例代码如下: >>> L='ABCDEFG' >>> L[2:5] 'CDE' >>> L[:5] 'ABCDE' >>> L[-5:] 'CDEFG' >>> L[::2] 'ACEG

【Python笔记】Python的几个高级语法概念浅析:lambda表达式 &amp;&amp; 闭包 &amp;&amp; 装饰器

本文主要记录自己对几个高级语法概念的理解:匿名函数.lambda表达式.闭包.装饰器. 这几个概念并非Python特有,但本文只限于用Python做说明. 1. 匿名函数 匿名函数(anonymous function)是指未与任何标识符绑定的函数,多用在functional programming languages领域,典型应用场合: 1) 作为参数传给高阶函数(higher-order function ),如python中的built-in函数filter/map/reduce都是典型的

Python笔记1#Python数据类型、语法和函数

▲python语法 以#开头的语句是注释,解释器(CPython)会忽略掉注释 当语句以:结尾时,下行缩进的语句视为代码块.默认缩进4个空格 缩进的利:强迫写出格式化的.缩进较少的代码 缩进的弊:重构代码时复制粘贴功能失效 Python中,通常用全部大写的变量名表示常量 ▲转义字符\ \n表示换行,\t表示制表符,\\表示\,\'表示普通字符',\"表示普通字符" ▲格式化字符串的输出 在字符串内部,%s表示用字符串替换,%d表示用整数替换,%f表示用浮点数替换,%x表示用十六进制整数

High Performance Python 笔记(Python是门不错的语言,全栈程序员就用它好了!)

High Performance Python 目录 1Understanding Performant Python 2Profiling 3Lists and Tuples 4Dictionaries and Sets 5Iterators and Generators 6Matrix and Vector Computation 7Compiling to C 8Concurrency 9multiprocessing 10Clusters and Job Queues 11Using L

《Python 学习手册4th》 第六章 动态类型简介

''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书)“重点笔记”“本章习题” - 标题1,二级标题用- 标题2,笔记大纲标题.习题题目- 加粗,16px ''' 重点笔记 : 摘要 动态类型是Python语言灵活性的根源(尤其是其提供的多态性) 一. 缺少类型声明语句的情况 在Python中,类型是在运行过程中自动决定的,而不是通过代码声明. 二. 变量.对

编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别

最近在研究Python和Erlang.反复提到动态类型语言.动态语言.解释型语言这些概念.这些概念很生涩,在这里做一个总结. 编译型语言和解释型语言 1.编译型语言 需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言.一般需经过编译(compile).链接(linker)这两个步骤.编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件. 优点:编译器一般会有预编译的过程对代码进行优化.因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行