day16 阶段总结
课程目标:对第二模块 “函数和模块” 阶段的知识点进行总结。
课程概要:
- 知识补充
- 阶段总结(思维导图)
1. 知识补充
1.1 nolocal关键字
在之前的内容中,我们讲解过 global 关键字:
name = 'root'
def outer():
name = "轩小陌"
def inner():
global name
name = 123
inner()
print(name)
outer()
print(name)
>>输出结果:
轩小陌
123
其实,还有一个 noloca 关键字,它声明的是上一级的变量。noloca 用的比较少,此处作为了解即可:
name = 'root'
def outer():
name = "轩小陌"
def inner():
nonlocal name
name = 123
inner()
print(name)
outer()
print(name)
>>输出结果:
123
root
name = 'root'
def outer():
name = 'alex'
def func():
name = "轩小陌"
def inner():
nonlocal name
name = 123
inner()
print(name)
func()
print(name)
outer()
print(name)
>>输出结果:
123
alex
root
name = 'root'
def outer():
name = 'alex' 123
def func():
nonlocal name
name = "轩小陌" 123
def inner():
nonlocal name
name = 123
inner()
print(name)
func()
print(name)
outer()
print(name)
>>输出结果:
123
123
root
1.2 yield from
在生成器部分我们讲解了 yield 关键字,在 python3.3 之后又引入了一个 yield from 关键字。
# yield from作用是可以在生成器函数执行时,跳到另一个生成器函数中并执行:
def foo():
yield 2
yield 2
def func():
yield 1
yield from foo()
yield 1
for item in func():
print(item)
>>输出结果:
1
2
2
1
1.3 深浅拷贝
-
浅拷贝
-
不可变类型,不拷贝。
import copy v1 = "轩小陌" print(id(v1)) >>输出结果:140652260947312 v2 = copy.copy(v1) print(id(v2)) >>输出结果:140652260947312
按理说拷贝v1之后,v2的内存地址应该不同,但由于python内部优化机制,v1、v2的内存地址是相同的。因为对不可变类型而言,如果以后修改值,会重新创建一份数据,不会影响原数据,所以,对不可变类型而言,进行深浅拷贝并无实际意义。
-
可变类型:浅拷贝只拷贝第一层,其内部的可变或不可变类型均不会被拷贝。
import copy v1 = ["轩小陌", "root", [44, 55]] print(id(v1)) >>输出结果:140405837216896 print(id(v1[2])) >>输出结果:140405837214592 v2 = copy.copy(v1) print(id(v2)) >>输出结果:140405837214784 print(id(v2[2])) >>输出结果:140405837214592
-
-
深拷贝
-
不可变类型,不拷贝
import copy v1 = "轩小陌" print(id(v1)) >>输出结果:140188538697072 v2 = copy.deepcopy(v1) print(id(v2)) >>输出结果:140188538697072
特殊的元组:
-
元组元素中无可变类型,不拷贝
import copy v1 = ("轩小陌", "root") print(id(v1)) >>输出结果:140243298961984 v2 = copy.deepcopy(v1) print(id(v2)) >>输出结果:140243298961984
-
元组元素中有可变类型,对所有
可变类型
或含有可变类型的元组
均拷贝一份import copy v1 = ("轩小陌", "root", [11, [44, 55], (11, 22), (11, [], 22), 33]) v2 = copy.deepcopy(v1) print(id(v1)) # 140391475456384 print(id(v2)) # 140391475456640 print(id(v1[2])) # 140352552779008 print(id(v2[2])) # 140352552920448 print(id(v1[2][1])) # 140642999940480 print(id(v2[2][1])) # 140643000088832 print(id(v1[2][2])) # 140467039914560 print(id(v2[2][2])) # 140467039914560 print(id(v1[2][3])) # 140675479841152 print(id(v2[2][3])) # 140675480454784
-
-
可变类型,对外部和内部所有层级的
可变类型
或含有可变类型的元组
均拷贝一份import copy v1 = ["轩小陌", "root", [44, 55]] v2 = copy.deepcopy(v1) print(id(v1)) # 140405837216896 print(id(v2)) # 140405837214784 print(id(v1[2])) # 140563140392256 print(id(v2[2])) # 140563140535744
-
import copy
v1 = ["轩小陌", "root", [11, [44, 55], (11, 22), (11, [], 22), 33]]
v2 = copy.deepcopy(v1)
print(id(v1)) # 140391475456384
print(id(v2)) # 140391475456640
print(id(v1[2])) # 140352552779008
print(id(v2[2])) # 140352552920448
print(id(v1[2][1])) # 140642999940480
print(id(v2[2][1])) # 140643000088832
print(id(v1[2][2])) # 140467039914560
print(id(v2[2][2])) # 140467039914560
print(id(v1[2][3])) # 140675479841152
print(id(v2[2][3])) # 140675480454784