a = [1, 2, 3]
b = (c for c in a if c in a)
a = [2, 3, 4]
print(list(b))
def d(expr):
for c in expr:
if c in expr:
yield c
a1 = [1,2,3]
t = d(a1)
a1 = [2,3,4]
print(list(t))
输出:
[2, 3]
[1, 2, 3]
问题: 1)在第一个变体中,循环保留了列表的旧值([1,2,3]),但是条件表达式使用新列表a([2,3,4])。 2)如何用自己的生成器得到与生成表达式不同的结果?
例如,我将第一个示例中的a替换为实际列表,希望这能更清楚地回答我的第一个问题。
a = [1, 2, 3]
b = (c for c in [1,2,3] if c in [2, 3, 4])
a = [2, 3, 4]
print(list(b))
输出:
[2,3]
a1
的引用都指向局部变量a1
。在全局范围内更改a1
不会对其产生任何影响。 - glibduda1
,对函数中的a1
局部变量没有影响。 - glibduda1 = [2,3,4]
改为a1[:] = [2,3,4]
,这将产生另一个(不同的)输出。 - glibduda1[:] = [2, 3, 4]
替代。这将给你[2, 3, 4]
,因为当执行到for c in a1
时,a1
已经是[2, 3, 4]
。 - Patrick Haugh