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))