python全栈讲解_python全栈第六讲

本文介绍了Python中内存管理的驻留机制和小数据池的概念,强调它们如何节省内存和提升性能。驻留机制确保相同值的int和特定规则的str变量使用同一内存地址。小数据池主要针对-5到256的int和特定字符串。同时,文章提醒在循环中修改列表或字典的长度可能导致错误,并提供了正确处理此类情况的方法。

一、小数据池

id可获取内存地址,==是判断两个对象的值是否相同,而is判断的是两对象的内存地址是否相同。

一个文件就是一个代码块(函数、类都是一个代码块);在文件交互命令里一行就是一个代码块。

同一个代码块有数据驻留机制,即同样的值赋给不同的变量,两个变量的内存地址是一样,这样就避免了内存的浪费。

i1 = 1000i2= 1000

print(i1 is i2)

驻留机制针对的对象:

int:任意数字

str:几乎所有字符串((字符串X数字)字符串含特殊字符或总字符大于20时例外)

在不同代码块间的缓存机制叫小数据池。

小数据池针对的对象有:

int:-5~256

str:一定规则的字符串

bool

空元祖

不管是同代码块的缓存机制还是不同代码块间的小数据池的驻留机制,其目的是相同的:

1、节省内存空间

2、提升性能

二、数据类型的补充

6f7d81c8cf88c1cb3c58d4429dec9914.png

fromkeys可以往字典里添加值相同的不同键值对。如果值的数据类型可变,那么其在内存里面id一样。用法为:

dic = dict.fromkeys([key1,key2,key3],'value')

执行后再字典dic里会添加三个值均为'value的键值对,如果'value'是一个可变的数据类型,它在内存里的地址一样。

循环易犯的错误:

循环一个列表时要轻易去改变列表的长度,否则会影响最后的结果,详细实例如下:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

循环,更改列表

例:将列表 l1= [11,22,33,44,55] 的索引为奇数的对应的元素全部删除

方法一:del l1[1::2]print(l1)

方法二:(错误示例)for index inrange(len(l1)):if index % 2 == 1:

l1.pop(index)print(l1)***循环一个列表时要轻易去改变列表的长度,否则会影响最后的结果

更正:for index in range(len(l1)-1,-1,-1):if index % 2 == 1:

l1.pop(index)print(l1)

倒序遍历,这样即使更改了列表长度也不会影响到后面的循环

方法三:

new_l=[]for index inrange(len(l1)):if index % 2 ==0:

new_l.append(l1[index])

l1=new_lprint(l1)

View Code

同样,循环一个字典时,不能改变字典的大小,否则会报错。详细示例如下:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3', 'name': 'alex'}

将字典中的key中含有k元素的所有键值对删除.

错误示例:for key indic:if 'k' inkey:

dic.pop(key)print(dic)

报错信息: dictionary changed size during iteration

更正:

l1=[]for key indic:if 'k' inkey:

l1.append(key)for key inl1:

dic.pop(key)print(dic)

View Code

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值