第一篇 变量及数据类型
# 一、变量
1 什么是变量
- 变量是描述世间万物变化的状态
- 内存就是变量,变量是用来临时存储数据的
- 形象的理解:变量相当于有名字的容器,该容器用于装载不同类型的数据
- 在程序执行过程中,值可以改变的量称为变量。变量可以通过变量名访问
- 计算机如何去模拟现实,首先它需要记录现实世界中各种事物的特征,而记录这些特征所需要的容器即是变量
2 为什么需要变量
- 程序所用到的数据都会保存在内存中,程序员需要一种机制来访问或修改内存中的数据,而这种机制就是变量(领会即可)
- 每一个变量都代表了一小块内存,而变量是有名字的,程序对变量赋值,其实就是把数据装入该变量所代表的内存区的过程
- 同样道理,程序读取变量的值,实际上就是从该变量所代表的内存区取值的过程
3 如何定义变量
-
name = 'king' #python中单引号和双引号都可以定义字符串 age = 20 #int 整数类型 gender = "female" weight = 62.5 #float 浮点型 msg = ''' 竹杖芒鞋轻胜马 一蓑烟雨任平生 ''' #多行字符串必须用三对单引号
-
变量的组成:变量名、赋值符号、变量值
-
变量名:用来引用变量值,但凡需要用变量值,都要通过变量名
-
赋值符号:赋值
-
变量值:存放数据,用来记录现实世界中的某种状态
-
命名规范:用英文,必须是字母或数字或下划线(它们的任意组合皆可),关键字不能声明为变量名,关键字比如:
'and','as','assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield'
等等 -
单行注释用井号,多行注释用三对双引号(通过下图,其实多行注释和定义多行字符串有不小渊源,编译器为pycharm)
# 二、 内存管理及小整数池
1 引用计数
- 变量值被引用的次数
- 当对象被创建并(将其引用)赋值给变量时,该对象的引用计数被设置为1。例如
x = 2
,则2
这个值的引用计数为1 - 当再编写一个变量名并指向该对象(以上述变量x为例子)的值(2)或者该对象的变量名 x 时,引用计数加 1。即
y = 2 或 y = x
,则2
这个值的引用计数为2 - 当指向该对象的变量名赋上另一个值时,原对象的引用计数减 1 ,但是新的值的引用计数加 1。即
x = 5
,y
任然等于2
,此时2
这个值的引用计数为1,5
这个值的引用计数也为1 del y
,则此时2
这个值引用计数为0,触发 python的垃圾回收机制,python 清理2
所占用的内存空间
垃圾回收机制:当变量值的引用计数为0时,python会收回该变量值的内存占用
2 del语句
- 格式:
del 删除对象
- 在Python语言中, del语句操作某个对象的时候, 并不是直接将该对象在内存中删除, 而是将该对象的引用计数-1
3 小整数池
- 对于引用计数,需要注意的是:Python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题, Python解释器会在启动时创建出小整数池,范围是(-5,256),该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被回收。
- 在pycharm中运行python程序时,pycharm出于对性能的考虑,会扩大小整数池的范围,其他的字符串等不可变类型也都包含在内以便采用相同的方式处理了,我们只需要记住这是一种优化机制,至于范围到底多大,无需细究。
4 关于可变数据类型和不可变数据类型
-
可变数据类型,是指对象中的一块内容(value)是可以被改变的,但它的地址不会再发生改变:对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请“要求”即可,也就是它的地址会保持不变,但总的区域会变长或者变短(也就是说它里面的元素的地址会发生改变)
- 对可变类型操作,相当于直接去修改变量的值。就算两个变量的值相同,所在的内存地址也不同。如果想要把让两个可变类型的内存地址相同可以使用赋值的语句。但是两个内存地址相同的可变类型,改变了其中一个的值,另一个也会跟着被改变
总结:对于可变数据类型变量本身,1、如果它的值重新赋值,就算它的值和之前一样,它的地址也会改变;如果只是它里面的元素改变了值,那么它本身的地址则不会发生任何变化;2、如果有一个和它同类型的新变量由它赋值而来(如:list_b = list_a),则它们的地址相同,而且他们之间如果其中一个改变它里面元素的值,另一个也会发生同样的改变;3、如果俩个变量是各自通过赋相同的值而来(如:a = [1] b =[1]),则它们的地址不同
- 对可变类型操作,相当于直接去修改变量的值。就算两个变量的值相同,所在的内存地址也不同。如果想要把让两个可变类型的内存地址相同可以使用赋值的语句。但是两个内存地址相同的可变类型,改变了其中一个的值,另一个也会跟着被改变
-
不可变数据类型是值变地址也会变:在对对象本身操作的时候,必须在内存中重新申请一块区域,然后将这块新的内存区域贴上原对象的变量名,原对象的引用计数减一
- 对不可变类型操作,相当于从新定义了一个新的变量。只是名字相同罢了,但是内存地址不同。由于pycharm的不断优化,对于整型、字符串、元组这些不可变数据类型,它的值相同,则地址也相同(最大范围需要查资料,略)
- 不可变类型有什么好处?如果数据是不可变类型,当我们把数据传给一个不了解的API时,可以确保我们的数据不会被修改
总结:对于不可变数据类型,只要它们的值相同,则地址一定相同
# 三、关于定义变量的三个特征
1 变量有哪三个特征
- 值、地址
id()
、数据类型type()
2 变量值的比较
-
判断变量值是否相等
-
注意:当我们在 python 中用
print(a is b)
时,表示是比较a
和b
的地址
3 变量id是否相等
-
判断变量地址是否相等
# 四、数据类型
1 简介数据类型
- 为了合理利用内存空间而将变量所能存储的数据的大小等特征固定下来的一种声明
- 变量是用来存储值的所在处,它们有名字和数据类型。变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。在声明变量时也可指定它的数据类型。所有变量都具有数据类型,以决定能够存储哪种数据
2 数字类型
- 整数类型:int 。在python中整型直接可以写出
a = 666
- 浮点数类型:float。在python中整型直接可以写出
b = 6.66
- 后面再详细介绍
3 字符串类型
- 字符串只能 相加、相乘和逻辑比较
- 字符串只能和数字相乘
- 字符串的拼接,即重新申请一个小空间把两个字符串都拷贝一份后再拼接。而不是把一个小空间内的变量值复制到另一个变量的小空间内拼接
4 列表类型
- 当我们需要存储多个不相关的字符时,如果用字符串类型则不好取出,所以我们利用列表就很容易
- 列表有点类似与C中的数组,但是C中的数组如果取出来需要用到循环
- 格式:例如
title_list = ['Journey to the West', 'The Romance of the Three Kingdoms','The Story of the Stone','Water Margins']
- 可以直接取出:
print(title_list)
- 也可以单独一个一个的取出:
print(title_list[0])
- 和数组相似,列表也可以有多维的:例如
taste_list = ['read','swim',['delicacy',20,'sweet-smelling'],'walk']
,假如当我们需要取出里面的20
(美食价格20元)时,我们只需要print(taste_list[2][1])
5 字典类型
-
能通过列表取值的时候,是基于我们已经知道了列表内部所有的元素。当我们不知道数据的大小或者数据非常庞大时,我们该如何存取
-
因此我们是不是可以给列表内的每一个元素都添加一个描述信息呢?否则如果不是存我的信息,而是用列表存取了成千上万个值,那么我们怎么通过索引精准取值呢?这样看起来好像是不可能的,因此可以使用新的数据类型——字典
1.作用:用来存取多个值,按照key:value的方式存值,取的时候可以通过key而非索引去取值,key对value具有描述性的作用。存放数据的种类各种各样并且数据较多的时候可以使用字典
2.定义:在{}内用逗号分隔开多个元素,每一个元素都是key: value的格式,其中value是任意格式的数据类型,key由于具有描述性的作用,所以key通常是字符串类型
-
字典举例:
user_info = {'name':'king','gender':'male','age':26,'height':175}
print(user_info['name'])
结果是king
-
字典嵌套字典举例:
user_info = {'name':'king','age':26,'school_info':{'s_name':'oldboy','s_address':'shanghai','s_area':1000},'gender':'male'}
print(user_info['school_info']['s_address'])
结果是shanghai
-
字典嵌套列表举例:
user_info = {'name':'king','age':26,'school_info':['oldboy','shanghai'],'gender':'male'}
print(user_info['school_info'][1])
结果是shanghai
-
列表嵌套字典举例:
students = [{'name':'king','weight':62.5},{'name':'queen','age':24}]
print(students[1]['age'])
结果是24
6 布尔类型
- 用于判断条件结果,通常情况不会直接引用,需要使用逻辑运算得到结果
- Python中所有数据类型的值自带布尔值,数据类型中只需要记住只有0、None、空、False的布尔值为False,其余的为True
print(type(True))
结果是<class 'bool'>
print(True)
结果是True
print(bool(0))
结果是False
print(bool('king'))
结果是True