You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python迭代器的__next__()方法与内置next()函数有什么区别?

核心结论

首先纠正你的误解:it.__next__()和next(it)两者都会修改迭代器对象,调用后会将迭代器的读取指针后移、消耗对应元素,不会保持迭代器状态不变。比如你给出的示例代码运行后,两行语句会依次返回2和3,最终迭代器it仅剩4一个元素。

两者的区别主要有三点:

  • 定位与适用场景不同
    next()是Python官方提供的公开内置函数,是普通业务代码中获取迭代器下一个元素的标准用法,符合Python的设计约定。而__next__()是Python的魔法方法,属于迭代器的内部实现接口,设计目的仅为给开发者自定义迭代器时重写逻辑使用,不属于给普通用户直接调用的公开API。Python约定所有双下划线开头的方法都属于内部实现细节,不建议业务代码直接调用。
  • 功能丰富度不同
    next()支持传入第二个参数作为迭代耗尽时的默认返回值,写法为next(it, 默认值),当迭代器没有剩余元素时会直接返回你指定的默认值,不会抛出StopIteration异常。而直接调用.__next__()没有这个能力,迭代耗尽时必然抛出异常。
  • 兼容性更稳定
    内置函数next()会自动做类型校验,确保传入的对象确实符合迭代器协议才会调用对应逻辑,适配所有符合Python规范的迭代器对象。而直接调用.__next__()如果遇到没有实现该方法的对象,只会直接抛出属性错误,没有额外的兼容处理。

对应Python之禅的约定,官方推荐的“唯一显而易见的实现方式”就是使用next(),直接调用.__next__()属于非规范用法,仅在自定义迭代器的实现代码中才应该出现。

内容的提问来源于stack exchange,提问作者ClGide

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:24:05