qq_16285729 2023-03-20 15:36 采纳率: 0%
浏览 22

python使用yield中出现的问题

python yield使用过程出现一个不知道为什么行不通的点

a = [1,2,3,4,5]

def aaa(a):
    for i in range(0,len(a)):
        a.remove(a[0])
        yield a

result =[]
for i in range(0,5):
    result1 = next(aaa(a))
    result.append(result1)
print(result)
print(result[-2])

[[], [], [], [], []]
[]

另一种书写

a = [1,2,3,4,5]

def aaa(a):
    for i in range(0,len(a)):
        a.remove(a[0])
        yield a

result =[]
for i in range(0,5):
    result1 = next(aaa(a))
    result.append(list(result1))
print(result)
print(result[-2])

[[2, 3, 4, 5], [3, 4, 5], [4, 5], [5], []]
[5]
为什么呢,求各位指教

  • 写回答

4条回答 默认 最新

  • simple_chenc 2023-03-20 16:06
    关注

    实际上是如下代码

    # 第一种情况,实际上是如下代码
    a = [1,2,3,4,5]
    print("a的地址是", id(a))
    
    def aaa(a):
        for i in range(0,len(a)):
            a.remove(a[0])
            yield a
    
    result =[]
    for i in range(0,5):
        result1 = next(aaa(a))
        # 这种情况实际上是python的浅拷贝现象,追加进去的元素,实际上还都是指向的a,在内存中是同一块内存地址
        print("result1的地址是:", id(result1))
        # result1 实际上就是a
        result.append(result1)
    print(result)
    
    
    # 第二种情况是进行了深拷贝
    
    a = [1,2,3,4,5]
    print("a的地址是", id(a))
    def aaa(a):
        for i in range(0,len(a)):
            a.remove(a[0])
            yield a
    
    result =[]
    for i in range(0,5):
        result1 = next(aaa(a))
        # 这里是进行了深拷贝,new_a不在指向原来的a的内存地址,而是在内存中复制了一份新的数据,第一种情况是都是指向的a列表,所以第一种情况下 a列表的元素被删除,其他的也会跟着被删除
        new_a = list(result1)
        print("new_a的内存地址是:", id(new_a))
        result.append(new_a )
    print(result)
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月20日

悬赏问题

  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除
  • ¥15 使用MATLAB进行余弦相似度计算加速
  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术
  • ¥15 DockerSwarm跨节点无法访问问题