yuan生的小小白 2022-03-01 09:37 采纳率: 100%
浏览 40
已结题

Python中为什么将函数赋给变量以后具体实现的效果会不一样?

我在学Python生成器的时候遇到了一个问题,将一个生成器赋给变量以后调用next方法可以成功迭代,但是直接用生成器调用却一直返回初始值
问题相关代码
# 一个遍历1-100的生成器
def gen():
    i = 1
    while i <= 100:
        yield i
        i += 1


# 将生成器赋值给一个变量
g = gen()

# 分别输出他们的地址值
print(g)
print(gen())

# 使用赋值后的变量获取数据
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())

# 直接使用生成器获取数据
print(gen().__next__())
print(gen().__next__())
print(gen().__next__())
print(gen().__next__())
print(gen().__next__())

运行结果及报错内容

变量输出的地址值:<generator object gen at 0x0000022BE138AF20>
生成器输出的地址值:<generator object gen at 0x0000022BE138A120>

使用赋值后的变量获取数据的结果:
1
2
3
4
5

直接使用生成器获取数据的结果:
1
1
1
1
1

我想要达到的结果

请问为什么使用生成器赋值后的变量可以成功迭代,而直接使用生成器却不可以,而且为什么明明是生成器直接赋值的变量,他们的地址值却不相同,谢谢

  • 写回答

1条回答 默认 最新

  • 陈年椰子 2022-03-01 14:23
    关注

    我觉得是每直接调用一次

    gen().__next__()
    

    其实就是从生成器入口,开始遍历生成器。

    print(id(g.__next__()))
    print(id(g.__next__()))
    print(id(g.__next__()))
    
    print(id(gen().__next__()))
    print(id(gen().__next__()))
    print(id(gen().__next__()))
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月10日
  • 已采纳回答 3月2日
  • 修改了问题 3月1日
  • 创建了问题 3月1日

悬赏问题

  • ¥15 无源定位系统的时差估计误差标准差
  • ¥15 请问这个代码哪里有问题啊
  • ¥20 python--version在命令端输入结果Python is not defined怎么办?还有pip不是exe格式是不是没安装成功?
  • ¥15 通过GaussianView进行结构微调消除虚频
  • ¥15 调用transformers库
  • ¥15 由于导出的数据名字中带有/,导致Matlab打不开,怎么办?
  • ¥15 新硬盘安装的程序总是崩溃,提示遇到错误
  • ¥15 openpcdet自制数据集评估bev精度和3d精度相同
  • ¥15 excel 上下按钮 显示行
  • ¥20 云卓h12pro 数传问题