当前位置:
首页 > temp > python入门教程 >
-
python--高级语法 4
day2:
1、代码块(重点)
- 代码块:我们所有的代码都需要依赖代码块执行。
- 一个模块,一个函数,一个类,一个文件等都是一个代码块。。
- 而作为交互方式输入的每个命令都是一个代码块。
而对于一个文件中的两个函数,也分别是两个不同的代码块:
2、代码块的缓存机制
-
两个机制: 同一个代码块下,有一个机制。不同的代码块下,遵循另一个机制。
-
同一个代码块下的缓存机制。
-
前提条件:同一个代码块内。
-
机制内容:pass
机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id相同
-
适用的对象: int bool str
-
具体细则:所有的数字,bool,几乎所有的字符串。
-
优点:提升性能,节省内存。
-
-
不同代码块下的缓存机制: 小数据池。
-
前提条件:不同代码块内。
-
机制内容:pass
Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。 python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。 其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个
-
适用的对象: int bool str
-
具体细则:-5~256数字,bool,满足规则的字符串。
-
优点:提升性能,节省内存。
-
总结:
- 面试题考。
- 回答的时候一定要分清楚:同一个代码块下适用一个缓存机制。不同的代码块下适用另一个缓存机制(小数据池)
- 小数据池:数字的范围是-5~256.
- 缓存机制的优点:提升性能,节省内存。
3、深浅copy(面试会考)
1,先看赋值运算
- 对于赋值运算来说,a1与a2指向的是同一个内存地址,所以他们是完全一样的,在举个例子,比如张三李四合租在一起,那么对于客厅来说,他们是公用的,张三可以用,李四也可以用,但是突然有一天张三把客厅的的电视换成投影了,那么李四使用客厅时,想看电视没有了,而是投影了,对吧?a1,a2指向的是同一个列表,任何一个变量对列表进行改变,剩下那个变量在使用列表之后,这个列表就是发生改变之后的列表。
#赋值运算
a1=[1,2,3,[22,33]]
a2=a1
a1.append(666)
print(a1,id(a1))
print(a2,id(a2))
[1, 2, 3, [22, 33], 666] 1768812233480
[1, 2, 3, [22, 33], 666] 1768812233480
Process finished with exit code 0
2,浅拷贝copy。
- 对于浅copy来说,只是在内存中重新创建了开辟了一个空间存放一个新列表,但是新列表中的元素与原列表中的元素是公用的。
所以a1 和a2的ID不同,但是内容ID相同
#浅copy
#同一代码块下:
a1=[1,2,3,[22,33]]
a2=a1.copy()
a1.append(666)
print(a1,id(a1))
print(a2,id(a2))
[1, 2, 3, [22, 33], 666] 1321060254472
[1, 2, 3, [22, 33]] 1321059431112
Process finished with exit code 0
#*********************************************
# 不同代码块下:
a1=[1,2,3,[22,33]]
a2=a1.copy()
a1[-1].append(666)
print(a1,id(a1))
print(a2,id(a2))
#打印a1 a2中小列表的存储ID
print(id(a1[-1]))
print(id(a2[-1]))
[1, 2, 3, [22, 33, 666]] 2332545303304
[1, 2, 3, [22, 33, 666]] 2332544479944
2332545286088
2332545286088
Process finished with exit code 0
思考1:a2 浅拷贝a1后,a1列表中的小列表添加元素后,a2的小列表为啥也添加?
---因为a1 a2 是两个不同的大列表,但是列表里边的元素都是公用一个,所以a1的小列表添加666 a2的小列表也添加666
思考2:如果使a1[0]=90,此时a2[0]是否等于90? 为什么a2[0]不变?
因为之前的a1[0],a1[1],a1[3]是1,2,3 是字符串,是不可变的,我改变的不是a1[0]本身,我只是改变了a1这个列表第一个槽位的内存关系
a1=[1,2,3,[22,33]]
a2=a1.copy()
a1[0]=90
print(a1)
print(a2)
[90, 2, 3, [22, 33]]
[1, 2, 3, [22, 33]]
Process finished with exit code 0
3,深拷贝deepcopy
- 深copy则会在内存中开辟新空间,将原列表以及列表里边的可变的数据类型重新创建一份,不可变的数据类型则沿用之前的(即公用一个)
#深copy
import copy
a1=[1,2,3,[22,33]]
a2=copy.deepcopy(a1)
print(a1,id(a1))
print(a2,id(a2))
[1, 2, 3, [22, 33]] 1512146813512
[1, 2, 3, [22, 33]] 1512146814664
Process finished with exit code 0
示例:a1[-1].append(666)
#深copy
import copy
a1=[1,2,3,[22,33]]
a2=copy.deepcopy(a1)
a1[-1].append(666)
print(a1)
print(a2)
[1, 2, 3, [22, 33, 666]]
[1, 2, 3, [22, 33]]
Process finished with exit code 0
4,深浅拷贝面试题
#面试题:
# 考察的内容是:切边是深拷贝还是浅拷贝?--浅拷贝
a1=[1,2,3,[22,33]]
a2=a1[:]
a1[-1].append(666)
print(a1)
print(a2)
# 浅copy: list dict: 嵌套的可变的数据类型是同一个。
# 深copy: list dict: 嵌套的可变的数据类型不是同一个 。
def eat(a,b,c,d):
print('我请你吃:{},{},{},{}'.format(a,b,c,d))
eat('蒸羊羔', '蒸熊掌', '蒸鹿邑','烧花鸭')
# 急需要一种形参,可以接受所有的实参。
# 万能参数: *args, 约定俗称:args,
# 函数定义时,*代表聚合。 他将所有的位置参数聚合成一个元组,赋值给了 args。
def eat(*args):
print(args)
print('我请你吃:{},{},{},{}'.format(*args))
eat('蒸羊羔', '蒸熊掌', '蒸鹿邑','烧花鸭')
出处:https://www.cnblogs.com/wushaofan/p/17156647.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数