67_locals_vs_globals.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. # https://gist.github.com/dean0x7d/df5ce97e4a1a05be4d56d1378726ff92
  2. a = 1
  3. my_locals = {"b": 2}
  4. # With user-defined locals:
  5. exec("""
  6. import sys
  7. assert locals() != globals()
  8. assert "sys" in locals()
  9. assert "sys" not in globals()
  10. assert "a" not in locals()
  11. assert "a" in globals()
  12. # print(a) # checks `locals()` first, fails, but finds it in `globals()`
  13. assert (a == 1), a
  14. assert "b" in locals()
  15. assert "b" not in globals()
  16. # print(b)
  17. assert (b == 2), b
  18. def main():
  19. assert locals() != globals()
  20. assert "sys" not in locals() # not the same `locals()` as the outer scope
  21. assert "sys" not in globals() # and `sys` isn't in `globals()`, same as before
  22. assert "b" not in locals() # again, not the same `locals()` as the outer scope
  23. main()
  24. """, globals(), my_locals)
  25. assert "sys" in my_locals # side effect
  26. assert "sys" not in globals()
  27. # With default locals:
  28. exec("""
  29. import sys
  30. assert locals() == globals()
  31. assert "sys" in locals()
  32. assert "sys" in globals()
  33. def main():
  34. assert locals() != globals()
  35. assert "sys" not in locals() # not the same locals as the outer scope
  36. assert "sys" in globals() # but now be can access `sys` via `globals()`
  37. main()
  38. """, globals())
  39. assert "sys" in globals()