相关疑难解决方法(0)

生成器表达式使用生成器生成后分配的列表

我找到了这个例子,我无法理解为什么它无法预测?我认为它必须输出[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)

python expression generator

18
推荐指数
2
解决办法
829
查看次数

将列表理解与生成器表达式进行比较时出现意外结果

我认为我忽略了一些简单的事情,但似乎无法弄清楚到底是什么。请考虑以下代码:

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 list generator

7
推荐指数
1
解决办法
124
查看次数

如何强制Python在循环中创建新的变量/新范围?

今天我探讨了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 variables parameters closures for-loop

3
推荐指数
2
解决办法
1057
查看次数