[toc]
python基础八 小数据池、代码块
1.小数据池、代码块(了解,实际开发中用不到)
1.1 小数据池、代码块含义
小数据池、代码块属于python中的驻留机制,目的用于节省内存空间
代码块:一个py文件、一个函数、一个模块、一个类、交互模式(终端)下的每一行都是一个代码块
小数据池:python中的内存驻留机制,优先级比代码块低
⚠️先执行代码块然后执行小数据池
1.2 小数据池缓存机制
数字:-5 ~ 256
字符串:
1.定义时内容(不包含中文、特殊符号)长度不限,内容相同,就进行驻留
2.python3.6解释器字符串进行乘法时(不包含中文、特殊符号),总长度不能超过20
3.python3.7解释器字符串进行乘法时(不包含中文、特殊符号),总长度不能超过4096
⚠️验证小数据池机制必须在终端中,不能在IDE(例如pycharm)中验证,因为IDE中是一个py文件,是一个代码块,会优先执行
1.小数据池数字验证
//-5 ~ 256验证,返回结果为True,驻留,内存空间地址相同
>>> a = -5
>>> b = -5
>>> a is b
True
>>> print (id(a),id(b))
4331026288 4331026288
>>> a = 256
>>> b = 256
>>> a is b
True
>>> print (id(a),id(b))
4331034640 4331034640
//-5 ~ 256范围外验证,返回结果为False,不驻留,内存空间地址不同
>>> a = -6
>>> b = -6
>>> a is b
False
>>> print (id(a),id(b))
140558040632912 140557772390192
>>> a = 257
>>> b = 257
>>> a is b
False
>>> print (id(a),id(b))
140558039687984 140557772390256
2.小数据池字符串验证
2.1定义内容验证
//不包含中文、特殊符号,定义时内容相同,驻留,内存空间地址相同
>>> a = "abc"
>>> b = "abc"
>>> a is b
True
>>> print (id(a),id(b))
140558040616664 140558040616664
//包含中文、特殊符号,定义时内容相同,不驻留,内存空间地址不同
>>> a = "abc#"
>>> b = "abc#"
>>> a is b
False
>>> print (id(a),id(b))
140557772689168 140557772689112
>>> a = "abc#你好"
>>> b = "abc#你好"
>>> a is b
False
>>> print (id(a),id(b))
140557772596880 140557772596688
>>> a = "abc你好"
>>> b = "abc你好"
>>> a is b
False
>>> print (id(a),id(b))
140557772596688 140557772596880
2.1字符串乘法验证(python3.6)
//不包含中文和特殊符号,总长度不超过20,驻留,内存空间地址相同
>>> a = "hehe" * 3
>>> b = "hehe" * 3
>>> print (a is b)
True
>>> print (id(a),id(b))
140557772708656 140557772708656
>>> a = "hehe" * 5
>>> b = "hehe" * 5
>>> print (a is b)
True
>>> print (id(a),id(b))
140557772718488 140557772718488 //字符串相乘,等于20时驻留
//不包含中文和特殊符号,总长度超过20,不驻留,内存空间地址不同
>>> a = "hehe" * 6
>>> b = "hehe" * 6
>>> print (a is b)
False
>>> print (id(a),id(b))
140557772714992 140557772714912
//包含中文或者特殊符号,不管总长度是否超过20,都不驻留,内存空间地址不同
>>> a = "abc#你好" * 3
>>> b = "abc#你好" * 3
>>> print (a is b)
False
>>> print (id(a),id(b))
140231892539968 140231893044000 //总长度不超过20,但是内存地址还是不同
>>> a = "abc#你好" * 5
>>> b = "abc#你好" * 5
>>> print (a is b)
False
>>> print (id(a),id(b))
140231893461712 140231893461848
1.3 代码块缓存机制
数字:-5 ~ 正无穷
字符串:
1.定义时内容长度不限,内容相同,就 进行驻留
2.字符串进行乘法时(不包含中文和特殊符号),总长度不能超过20
1.代码块数字验证 (pycharm中验证)
//-5 ~ 正无穷验证,返回结果为True,驻留,内存空间地址相同
a = -5
b = -5
print (a is b)
True
print (id(a),id(b))
4453603184 4453603184
a = 1000000
b = 1000000
print (a is b)
True
print (id(a),id(b))
140434424966800 140434424966800
//-5 ~ 正无穷范围外验证,返回结果为False,不驻留,内存空间地址不同
a = -6
b = -6
print (a is b)
False
print (id(a),id(b))
140442480390000 140442480390032
2.字符串验证
2.1定义内容验证
//只要内容相同,就驻留,可以包含中文和字符串,小数据池中就不可以
a = "abc#你好"
b = "abc#你好"
print (a is b)
True
print (id(a),id(b))
140481266762928 140481266762928
2.2字符串乘法验证
//不包含中文、特殊符号,总长度不超过20,驻留,内存空间地址相同,与小数据池相同
a = "abc" * 6
b = "abc" * 6
print (a is b)
True
print (id(a),id(b))
140679911152496 140679911152496
//包含中文、特殊符号,无论总长度是否超过20,都不驻留,内存空间地址不同
a = "abc#你好" * 3
b = "abc#你好" * 3
print (a is b)
False
print (id(a),id(b))
140361947581552 140361947581216 //总长度不超过20,内存空间地址不同
a = "abc#你好" * 5
b = "abc#你好" * 5
print (a is b)
False
print (id(a),id(b))
140438049459712 140437243696104 //总长度超过20,内存空间地址不同
1.4 小数据池和代码块对比
小数据池 | 代码块 | |
---|---|---|
数字 | -5 ~ 256 驻留 | -5 ~ 正无穷 驻留 |
字符串定义内容 | 不能包含中文、特殊符号,长度不限,内容相同就驻留 | 可以包含中文、特殊符号,长度不限,内容相同就驻留 |
字符串乘法 | 不能包含中文、特殊符号,总长度不超过20就驻留 | 不能包含中文、特殊符号,总长度不超过20就驻留 |