Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python生成器行为_Python_Iterator_Generator - Fatal编程技术网

Python生成器行为

Python生成器行为,python,iterator,generator,Python,Iterator,Generator,输入: import itertools ws=[] subs=[] set_subs=[] for i in xrange(int(raw_input())): S=raw_input() l=len(S) subs.append(S[i:j+1] for i in xrange(l) for j in xrange(i,l)) 现在subs[0]和subs[1]都给出了相同的结果 2 aab aac 而列表(subs[0])应该是['a'、'aa'、'aab'、'

输入:

import itertools
ws=[]
subs=[]
set_subs=[]
for i in xrange(int(raw_input())):
    S=raw_input()
    l=len(S)
    subs.append(S[i:j+1] for i in xrange(l) for j in xrange(i,l))
现在
subs[0]
subs[1]
都给出了相同的结果

2
aab
aac
列表(subs[0])
应该是
['a'、'aa'、'aab'、'a'、'ab'、'b']

我模模糊糊地明白为什么会这样。如何使
subs[0]
subs[1]
真正不同

注意:更改行

print list(subs[0])
>>>['a','aa','aac','a','ac','c']
print list(subs[1])
>>>['a','aa','aac','a','ac','c']

不是选项

生成器表达式中使用的变量在 将为generator对象调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu next()
方法(以相同的方式) 与普通发电机一样流行)。然而,最左边的for子句是 立即进行评估,以便能够看到由此产生的错误 在处理生成器的代码中出现任何其他可能的错误之前 表情。不能立即计算后续for子句 因为它们可能依赖于前面的for循环

S[i:j+1]
在执行生成器时进行计算,此时
S
具有最新值

您可以使用普通发电机代替。现在
ss
subgen
本地的:

subs.append([S[i:j+1] for i in xrange(l) for j in xrange(i,l)])

这是生成器表达式的一个奇怪特性。看看
在您的情况下,它用于后期绑定,这就是为什么您会得到两个相同的结果。

只是一个建议:您不应该在生成器表达式中将
i
作为变量重用。这会导致混乱。
subs.append([S[i:j+1] for i in xrange(l) for j in xrange(i,l)])
import itertools

def subgen(ss):
    l=len(ss)
    for i in xrange(l):
        for j in xrange(i,l):
            yield ss[i:j+1]

subs=[]
for i in xrange(int(raw_input())):
    S=raw_input()
    subs.append(subgen(S))