轩小陌的Python笔记-day16 模块二总结

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

2. 阶段总结

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值