我找到了这个例子,我无法理解为什么它无法预测?我认为它必须输出[1, 8, 15]
或[2, 8, 22]
.
array = [1, 8, 15]
g = (x for x in array if array.count(x) > 0)
array = [2, 8, 22]
print(list(g))
>>>[8]
Run Code Online (Sandbox Code Playgroud) 我认为我忽略了一些简单的事情,但似乎无法弄清楚到底是什么。请考虑以下代码:
a = [2, 3, 4, 5]
lc = [ x for x in a if x >= 4 ] # List comprehension
lg = ( x for x in a if x >= 4 ) # Generator expression
a.extend([6,7,8,9])
for i in lc:
print("{} ".format(i), end="")
for i in lg:
print("{} ".format(i), end="")
Run Code Online (Sandbox Code Playgroud)
我希望两个for循环都会产生相同的结果,所以4 5
。但是,打印生成器exp的for循环会打印4 5 6 7 8 9
。我认为这与列表理解的声明(在扩展之前声明)有关。但是,为什么生成器的结果与在扩展列表之前也声明过的不同呢?例如内部发生了什么?
今天我探讨了Python 的奇怪行为.一个例子:
closures = []
for x in [1, 2, 3]:
# store `x' in a "new" local variable
var = x
# store a closure which returns the value of `var'
closures.append(lambda: var)
for c in closures:
print(c())
Run Code Online (Sandbox Code Playgroud)
上面的代码打印出来
3
3
3
Run Code Online (Sandbox Code Playgroud)
但是我希望它能打印出来
1
2
3
Run Code Online (Sandbox Code Playgroud)
我为自己解释了这种行为,var
它始终是相同的局部变量(并且python不像其他语言那样创建新的行为).如何修复上面的代码,以便每个闭包都返回另一个值?
python ×3
generator ×2
closures ×1
expression ×1
for-loop ×1
list ×1
parameters ×1
variables ×1