Python Function Scope and Lifetime
1. Concept Overview
Function scope and lifetime determine:
Where variables are accessible
How long variables exist in memory
Python follows the LEGB Rule for scope resolution:
Local
Enclosing
Global
Built-in
This defines how Python resolves variable names at runtime.
2. Local Scope
Variables defined inside a function belong to the local scope.
def calculate():
result = 50
print(result)
calculate()
# print(result) # NameErrorLocal variables exist only during function execution.
3. Global Scope
Variables defined outside functions are global.
Accessible throughout the module unless overridden.
4. Enclosing Scope (Nested Functions)
Inner functions can access variables from their enclosing scope.
5. Built-in Scope
Python reserves predefined identifiers:
Avoid overriding built-ins.
6. LEGB Resolution Demonstration
Variable resolution order: Local ➝ Enclosing ➝ Global ➝ Built-in.
7. Variable Lifetime
Lifecycle of variables:
Created when function is called
Exists during execution
Destroyed after execution completes
temp is deallocated after function exit.
8. Using global Keyword
Allows modifying global variables inside functions.
9. Using nonlocal Keyword
Modifies variables in enclosing (non-global) scope.
10. Scope Isolation Examples
Python does not have block scope; it has function scope.
Scope Types Summary
Local
Within function
Enclosing
Outer function
Global
Module-level
Built-in
Always available
Variable Lifetime Phases
Initialization
Variable created
Active
In use
Termination
Destroyed (garbage collected)
Common Pitfalls
Forgetting
globalwhen modifying globalsShadowing outer scope variables
Misusing nonlocal
Overlapping variable names
Accidental redefinition of built-ins
Real-World Enterprise Example
Used in:
Configuration propagation
Stateful closures
Session-based systems
Performance Implications
Overuse of globals increases coupling
Deeply nested scopes reduce readability
Memory not freed if references persist
Best Practices
Minimize global variable usage
Use function parameters instead of globals
Prefer nonlocal for closures
Use scoped variables for clarity
Avoid name shadowing
Enterprise Importance
Understanding scope and lifetime ensures:
Predictable variable behavior
Memory efficiency
Safer multithreading
Bug prevention
Maintainable architecture
Critical for:
Backend services
AI pipeline orchestration
Multi-user systems
Concurrent applications
Large-scale codebases
Last updated