Python的发电机行为(Python generator behaviour)

2019-06-24 17:47发布

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

输入:

2
aab
aac

现在无论是subs[0]subs[1]给我同样的结果。

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

list(subs[0])本来应该['a','aa','aab','a','ab','b']

我隐约明白为什么会这样。 我该怎么做才能让subs[0]subs[1]实际上是不同的。

:更改行

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

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

是不是一种选择

Answer 1:

http://docs.python.org/reference/expressions.html#generator-expressions

在发电机表达式中使用的变量被懒惰地评估当__next__()方法被调用生成器对象(以相同的方式为正常发电机)。 然而,对于子句最左边立即评估,使得由它产生的误差可以在之前处理该发电机表达的代码的任何其它可能的错误可以看出。 随后的条款可以,因为他们可能取决于前面的for循环不会立即进行评估。

S[i:j+1]时,执行该生成器被评估,并且在该点S具有最新的值。

您可以使用正常的发电机来代替。 现在ss是本地的subgen

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


Answer 2:

那么,这是发电机表达的奇怪特征之一。 看看这个在您的情况下,它被用于后期绑定,这就是为什么你会得到两个相同的结果。



文章来源: Python generator behaviour