python变量和数据类型(二)
1.python 变量,变量名,变量值
变量 变量,记录事物变化的状态。英文叫做Variable
变量名
当变量定义的时候,会在内存中申请一块空间专门用来存放变量值,而变量名,就是这个空间的门牌号,能方便的找到这块内存空间。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。因此,变量可以指定不同的数据类型,这些变量可以存储整数,小
数或字符。
变量值
变量值就是事物的状态,定义的之后可以用变量名来访问。变量值有一个引用次数,一旦这块空间被引用次数为0,就意味着我们没有途径能找到这块空间了,如果不进行清理, 会导致内存被占用。一旦找不到这块空间,就会触发Python的内存管理:垃圾回收机制,对该空间进行回收
再利用。而变量有三个非常重要的特性:id、type、变量值。
- id:就是变量值的内存空间地址,每一个值都有唯一一个id。内存地址不同,id就不相同。可以使用id()来查看变量的内存地址。
- type:不同类型的值记录事物的状态有所不同,这就是Python的数据类型。可以使用type()来查看。
例:
# 变量名 赋值符号 变量值
name = "Jack"
2.python 变量内存管理
2.1 变量存在哪里?
1.如果我们定义了一个变量,而我们没有用python解释器取运行的时候,这个变量其实就是很普通的几个字符而已。而当我们用Python解释器取运行它的时候,那字符进入了内存,才会有变量这个概念。也就是说变量是存放在内存当中的。
2.但是说变量只是存在内存中并没有很具体,实际上在每定义一个变量就会在这个内存的大空间中开辟一个小空间
2.2 引用计数
①.引用计数是针对变量值的
②.比如定义一个变量
#coding=utf-8; from sys import getrefcount a=1; #a的引用计数为1000000219 print(getrefcount(a)); b=a; #b在引用a,a的引用计数加1,1000000220 print(getrefcount(b),getrefcount(a)) c=b #c也在引用a,a的引用计数加1,1000000221 print(getrefcount(c),getrefcount(a)) # del 释放引用数,a的引用数1000000220 del c print(getrefcount(b),getrefcount(a))
运行结果:
1000000219 1000000220 1000000220 1000000221 1000000221 1000000220 1000000220
2.2.1 引用计数的弊端
① 需要额外的空间维护计数
② 对象的循环引用不能回收,造成内存泄漏
3.垃圾回收机制
1.当我们定义一个有效的变量时,这时候会在内存中自动分配一个小的存储空间给我们定义的变量的值,但是当我们让变量名接收一个其它的值的时候,那我们一开始所定义的那个变量的值就没有了变量名来接收,此时这个变量值就会看做成是垃圾,python就会处理这个垃圾,释放该内存占用,这就是python的垃圾回收机制
2.也就是说,当变量值的引用计数为0的时候,触发了垃圾回收制,释放一开始给他开辟的内存空间
e=1 print(getrefcount(e)) f=e print(getrefcount(e)) e=2 print(getrefcount(e))
运行结果:
1000000224 1000000225 1000000158
如上运行结果,当e的值改变,计数值也已改变,不再是原来那个。
4.小整数池
1.为了避免因创建相同的值而重复申请内存空间所带来的效率问题, Python解释器会在启动时创建出小整数池,范围是[-5,256],该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被垃圾回收机制回收。
2.在pycharm中运行python程序时,pycharm出于对性能的考虑,会扩大小整数池的范围,其他的字符串等不可变类型也都包含在内一便采用相同的方式处理了,我们只需要记住这是一种优化机制,至于范围到底多大,无需细究
5.python 变量定义实例
#coding=utf-8; #单个变量赋值 a=1 b=2.2 c='c' d="abcd" print(a,b,c,d) #多个变量赋值 a1,b1,c1 =11,'b',"ccc"; print(a1,b1,c1) a2=b2=c2=3.14 print(a2,b2,c2)
运行结果:
1 2.2 c abcd 11 b ccc 3.14 3.14 3.14
6.python 标准数据类型
Numbers(数字)
String(字符串)
List(列表)
Tuple(元组)
Dictionary(字典)
6.1 python 数字类型
数字数据类型用于存储数值。
他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。
当你指定一个值时,Number 对象就会被创建
6.1.1 python3支持4种不同的数字类型
- int(长整型)
- float(浮点型)
- complex(复数)
- bool(布尔型)
注意:1.long 类型只存在于 Python2.X 版本中,在 2.2 以后的版本中,int 类型数据溢出后会自动转为long类型。在 Python3.X 版本中 long 类型被移除,使用 int 替代。
2.Python3 中,bool 是 int 的子类
6.1.2 python 数字类型常用
int float complex 10 0.0 3.14j 100 15.20 45.j -786 -21.9 9.322e-36j 080 32.3e+18 .876j -0490 -90. -.6545+0J -0x260 -32.54e100 3e+26J 0x69 70.2E-12 4.53e-7j
- Python 还支持复数,复数由实数部分和虚数部分构成,可以用 a + bj,或者 complex(a,b) 表示, 复数的实部 a 和虚部 b 都是浮点型。
6.1.3 Python数据类型-整型定义例子
#coding=utf-8; a=1 b=0x69 c=1.22345456 d=True; e=3.14j f=2+1j print(type(a),type(b),type(c),type(d),type(e),type(f))
运行结果:
<class 'int'> <class 'int'> <class 'float'> <class 'bool'> <class 'complex'> <class 'complex'>
6.1.4 python数据类型-整型例子
#coidng=utf-8;
x=10
y=1.5
xy=x+y
t=True
xt=x+t
bj=x<y
bj2=x and y
bj3=x or y
print(type(x),type(y),type(xy),type(t),type(xt),xy,t,xt)
print(type(bj),type(bj2),type(bj3),bj,bj2,bj3)
运行结果:
<class 'int'> <class 'float'> <class 'float'> <class 'bool'> <class 'int'> 11.5 True 11 <class 'bool'> <class 'float'> <class 'int'> False 1.5 10