Skip to content

Instantly share code, notes, and snippets.

@dcreager
Created February 11, 2025 19:56
Show Gist options
  • Save dcreager/2729a6f9cf3302321e8d1df8d48a29ee to your computer and use it in GitHub Desktop.
Save dcreager/2729a6f9cf3302321e8d1df8d48a29ee to your computer and use it in GitHub Desktop.
Nested eager/lazy scopes in Python
x = [1]
a = [a for a in x]
print("eager", a) # eager [1]
x = [2]
print("eager", a) # eager [1]
x = [1]
def f():
return list(x)
print("lazy", f()) # lazy [1]
x = [2]
print("lazy", f()) # lazy [2]
x = [1]
class A:
a = list(x)
print("eager", A.a) # eager [1]
x = [2]
print("eager", A.a) # eager [1]
x = [1]
class A:
def f():
return list(x)
print("lazy in eager -> lazy", A.f()) # lazy in eager -> lazy [1]
x = [2]
print("lazy in eager -> lazy", A.f()) # lazy in eager -> lazy [2]
x = [1]
def f():
return [a for a in x]
print("eager in lazy -> lazy", f()) # eager in lazy -> lazy [1]
x = [2]
print("eager in lazy -> lazy", f()) # eager in lazy -> lazy [2]
x = [1]
class A:
a = [a for a in x]
print("eager in eager -> eager", A.a) # eager in eager -> eager [1]
x = [2]
print("eager in eager -> eager", A.a) # eager in eager -> eager [1]
x = [1]
def f():
def g():
return list(x)
return g
print("lazy in lazy -> lazy", f()()) # lazy in lazy -> lazy [1]
x = [2]
print("lazy in lazy -> lazy", f()()) # lazy in lazy -> lazy [2]
x = [1]
class A:
def f():
return [a for a in x]
print("eager in lazy in eager -> lazy", A.f()) # eager in lazy in eager -> lazy [1]
x = [2]
print("eager in lazy in eager -> lazy", A.f()) # eager in lazy in eager -> lazy [2]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment