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 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀
  • ¥15 flink cdc无法实时同步mysql数据