python列表本来没有next方法,为什么用iter函数生成的迭代器就凭空有了next方法了?

对list用__dir__()发现没有next方法,但是用iter()生成迭代器,对该迭代器再用__dir__(),发现有next方法了!
最新回答
温情绝傲

2024-11-30 12:43:35

next是进行迭代的方法,只有
迭代器
和生成器有。不仅列表没有next方法,
元组
字典什么的也都没有。你可以用type看一下数据类型,列表和迭代器是两个完全不同的东西。
追问
您没有回答“为什么”后面的问题
追答
要说“为什么”,就是生成了一个新的迭代器对象,和之前的列表仅有数据相同,其他完全不同
追问
iter()不就是返回列表对象的地址吗?把这个列表与一个变量绑定,这个变量怎么就成迭代器了?而且还凭空多出了一个next方法!
追答
iter()是生成迭代器的函数,你说的返回对象地址的是id()
而且严格来讲id()返回的是对象的标识符(唯一,不会重复),也不是内存中的地址
追问
哪具体来讲,对列表调用iter()函数,它是怎么生成这个新的迭代器对象的?
追答
假设b是一个列表,通过返回值,像a=iter(b)这样的形式,之后就可以对a进行迭代
追问
执行a=iter(b),实质是执行b.__iter__()方法,这个方法的代码块是什么?
追答
啊哈哈这个是python官方的代码,我就不清楚了,有兴趣可以在python文件目录里面翻一下看看能不能找到
追问
您的回答很有启发性,非常感谢!
会笑才不是傻冒

2024-11-30 12:59:44

list是可迭代对象,利用_iter方法产生一个迭代器,从而能够next,List不是迭代器,请注意两者区别。在for i in list过程中,从list对象的内置_iter产生一迭代器。iter()函数将list、tuple、dict等可迭代对象变成迭代器。
帅癌晚期

2024-11-30 18:07:13

我认为应该是调用iter()的时候,list中的__iter__的逻辑也把__next__方法实现了,或者是把__next__方法绑定到了list的self上面,这样调用iter(list)的时候,返回的就是一个实现了__iter__方法和__next__方法的迭代器了,否则说iter(list)是一个迭代器,但是这个迭代器缺没有__next__方法, 就和它的定义是相反的。
证明就是
test_list = [1,2,3]
print(dir(test_list))
iter_test = iter(test_list)

print(dir(iter_test))
而dir(iter_test)里面是有__next__方法的