python小数据池,is==id,编码
1.python中真正的代码块是什么?
一个模块,一个函数,一个类,一个文件等都是一个代码块
(1)
def fun():
print(333)
class A:
name='alex'
交互模式下,每一行是一个代码块。
>>>i1=111 可以理解为这一行在一个文件中
>>>i2=1000 可以理解为这一行在一个文件中
2. id is ==
id()查询对象的内存地址
== 比较的是两边的数值
is 比较的是两边的内存地址
name='alex' #赋值
print('alex'='alex') #数值相同
name='alex123'
name1='alex123'
print(id(name),id(name1)) #2612365476616 2612365476616
在内存中id都是唯一的,如果两个变量指向的值的id相同,就证明他们在内存中是同一个。
is判断的是两个变量的id值是否相同
如果is是True,==一定是True。
3.小数据池(缓存机制,驻留机制)
小数据池的应用数据类型:整数,字符串,bool值
1).小数据池,python对内存做的一个优化:
他将-5-256的整数,以及一定规则的字符串,提前在内存中创建了池,容器,容器里面固定的放了这些数。
2).为什么这么做?
(1)节省内存
(2)提高性能与效率
str:字符串要从下面这几个大方向讨论(了解即可!):
1,字符串的长度为0或者1,默认都采用了驻留机制(小数据池)。


2,字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留。

3,用乘法得到的字符串,分两种情况。
3.1 乘数为1时:
仅含大小写字母,数字,下划线,默认驻留。

含其他字符,长度<=1,默认驻留。

含其他字符,长度>1,默认驻留。

3.2 乘数>=2时:
仅含大小写字母,数字,下划线,总长度<=20,默认驻留。

4,指定驻留。
from sys import intern
a = intern('hello!@'*20)
b = intern('hello!@'*20)
print(a is b)
#指定驻留是你可以指定任意的字符串加入到小数据池中,让其只在内存中创建一个对象,多个变量都是指向这一个字符串。
满足以上字符串的规则时,就符合小数据池的概念。
bool值就是True,False,无论你创建多少个变量指向True,False,那么他在内存中只存在一个。
看一下用了小数据池(驻留机制)的效率有多高:
显而易见,节省大量内存在字符串比较时,非驻留比较效率o(n),驻留时比较效率o(1)。
4.一定规则的字符串
s1='alex'
s2='alex'
print(s1 is s2) #True
代码块:python在同一个代码块中的变量,初始化对象的命令时,他会将变量与值的对应关系放到一个字典中
如果下面的代码在运到初始化对象的命令时,他会先从字典中寻找,如果存在相同的值,他会复用,指向的是同一个内存地址。
python对应不同代码块:初始化对象命令时,他会从小数据池中寻找。
dic={'name':alex@的内存地址。}
name='alex@'
name='alex@' #name=name
同一个代码块
i1=1000
i2=1000
print(id(i1),id(i2)) #1663852060432 1663852060432
pycharm 通过运行文件的方式执行下列代码: 这是在同一个文件下也就是同一代码块下,采用同一代码块下的缓存机制。
i1 = 1000
i2 = 1000
print(i1 is i2) # 结果为True 因为代码块下的缓存机制适用于所有数字
通过交互方式中执行下面代码: # 这是不同代码块下,则采用小数据池的驻留机制。
>>> i1 = 1000
>>> i2 = 1000
>>> print(i1 is i2)
False # 不同代码块下的小数据池驻留机制 数字的范围只是-5~256.
通过交互方式中执行下面代码: # 这是不同代码块下,则采用小数据池的驻留机制。
>>> i1 = 1000
>>> i2 = 1000
>>> print(i1 is i2)
False # 不同代码块下的小数据池驻留机制 数字的范围只是-5~256.
5.编码
1).ascii:字母,数字,特殊字符
A:00000010
B:00000010
2).unicode:万国码,包含世界上所有的文字
创建之初:
A 0000 0010 0000 0010
中 0001 0010 0000 0010
升级:
A:0000 0000 0000 0000 0000 0000 0000 0000
中 0001 0010 0000 0010 0000 0010 0000 0010
浪费资源。
对unicode升级:utf-8
A:0000 0010
欧:0000 0010 0000 0010
中:0000 0010 0000 0010 0000 0000 24位
3).gb2312:国标:字母,数字,特殊字符,中文。
A:0000 0010 8位
中:0000 0010 0000 0010 16位
4).
(1)编码之间不能互相识别。
(2)网络传输,或者硬盘存储的010101,必须是以非unicode编码方式的01010101
5).大环境python3x:
str:内存(内部)编码方式为Unicode。
bytes:Python的基础数据类型,他和str相当于双胞胎。
区别:
(1)英文字母
str:
表现形式:s1='alex'
内部编码方式:unicode
bytes:
表现形式:b1=b'alex'
内部编码方式:非unicode
b1=b'alex'
b2=b1.upper()
s1='alex'
print(b1,type(b1)) #b'alex' <class 'bytes'>
print(b2,type(b2)) #b'alex' <class 'bytes'>
print(s1,type(s1)) #alex <class 'str'>
(2)中文字母
str:
表现形式:s1='太白'
内部编码方式:unicode
bytes:
表现形式:b'\xe5\xa4\xaa\xe7\x99\xbd'
内部编码方式:非unicode
s1='太白'
b1=s1.encode('utf-8')
print(b1) #b'\xe5\xa4\xaa\xe7\x99\xbd'
如何使用:
你想将一部分内容(字符串)写入文件,或者通过网络socker传输,这样这部分内容(字符串)必须转化成byte
str--->bytes encode 编码
s1='alex'
s2='太白'
b1=s1.encode('utf-8')
print(b1) #b'alex'
b2=s2.encode('gbk')
print(b2) #b'\xcc\xab\xb0\xd7'
byte----->str decode解码
b1=b'\xcc\xab\xb0\xd7' #gbk的bytes
s2=b1.decode('gbk')
print(s2) #太白
更多验证:
# 虽然在同一个文件中,但是函数本身就是代码块,所以这是在两个不同的代码块下,不满足小数据池(驻存机制),则指向两个不同的地址。
def func():
i1 = 1000
print(id(i1)) # 2288555806672
def func2():
i1 = 1000
print(id(i1)) # 2288557317392
func()
func2()


浙公网安备 33010602011771号