Python基础语法(十九)

理解生成器与拷贝技术
本文深入探讨了Python中的生成器概念,包括其定义、创建方式及应用场景,并详细对比了浅拷贝与深拷贝的区别,通过实例解析了两者在处理复杂数据结构时的行为差异。

1. 生成器

1. 定义

根据指定的规则循环生成数据,当条件不成立时,则生成数据结束。数据不是一次性全部生成处理,而是使用一个生成一个,可以节约大量的内存。

2. 创建方式

  1. 生成器推导式(简单算法生成)
    my_generator = (value * 2 for value in range(3))
    
    # for循环内部循环调用next函数获取生成器这种的下一值,当出现异常for循环内部自动进行了异常捕获。
    for value in my_generator:
        print(value)
    
    # 输出结果
    0
    2
    4
    
  2. yield关键字(复杂算法生成)
    def my_generator():
        for i in range(3):
            # 当程序执行到yield关键字的时候代码暂停并把结果返回,再次启动生成器的时候会在暂停的位置继续往下    执行。
            yield i
    
    
    for value in my_generator():
        print(value)
    
    # 输出结果
    0
    1
    2
    

2. 浅拷贝

1. 定义

copy函数是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象。对于不可变类型进行浅拷贝实际上是对引用的一个拷贝,两个变量指定的是一个内存地址。

2. 示例

import copy

lstNum1 = [1, 2, 3, [4, 5, 6]]

lstNum2 = copy.copy(lstNum1)

print("lstNum1-id: ", id(lstNum1))
print("lstNum2-id: ", id(lstNum2))
print("lstNum1[3]-id: ", id(lstNum1[3]))
print("lstNum2[3]-id: ", id(lstNum2[3]))

# 输出结果
lstNum1-id:  1219129264256
lstNum2-id:  1219130817728
lstNum1[3]-id:  1219129265024
lstNum2[3]-id:  1219129265024

3. 深拷贝

1. 定义

deepcopy函数是深拷贝,只要发现对象有可变类型就会对该对象到最后一个可变类型的每一层对象进行拷贝,对每一层拷贝的对象都会开辟新的内存空间进行存储。

2. 示例

import copy

lstNum1 = [1, 2, 3, [4, 5, 6]]

lstNum2 = copy.deepcopy(lstNum1)

print("lstNum1-id: ", id(lstNum1))
print("lstNum2-id: ", id(lstNum2))
print("lstNum1[1]-id: ", id(lstNum1[1]))
print("lstNum2[1]-id: ", id(lstNum2[1]))
print("lstNum1[3]-id: ", id(lstNum1[3]))
print("lstNum2[3]-id: ", id(lstNum2[3]))

# 输出结果
lstNum1-id:  2008661383360
lstNum2-id:  2008662932608
lstNum1[1]-id:  140736057169600
lstNum2[1]-id:  140736057169600
lstNum1[3]-id:  2008661384448
lstNum2[3]-id:  2008662929536

4. 浅拷贝和深拷贝的区别

  • 浅拷贝最多拷贝对象的一层
  • 深拷贝可能拷贝对象的多层
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值