Home >Backend Development >Python Tutorial >How Does the Behaviour of the `exec` Function Differ in Python 2 and Python 3?
Behavior of exec Function in Python 2 vs. Python 3
In Python 2 and Python 3, the exec function exhibits notable differences in behavior.
Reason for the Difference
In Python 2, exec was a statement that explicitly disabled local scope optimizations and allowed access to variables in both local and global scopes. In contrast, Python 3's exec() is a function that always optimizes function scopes.
Impact on Variable Binding
In Python 2, when using the exec statement, variables found in locals() were copied back to the function locals. This resulted in binding the variable inside the function to the values specified in the exec statement.
In Python 3, however, exec() does not have this behavior by default. Therefore, variables inside the function are not bound to those in the exec() statement.
Accessing Local Variables
To access local variables using exec() in Python 3, a new namespace (typically a dictionary) should be created and passed as an argument to the function.
Revised Code
Below is a revised code example that demonstrates the correct use of exec() in Python 3 to achieve the behavior of Python 2:
def execute(a, st): namespace = {} exec("b = {}\nprint('b:', b)".format(st), namespace) print(namespace['b'])
In this code, a dictionary named namespace is created and passed to exec(). Any variables defined within the exec() statement will be accessible through the dictionary.
Notes
The exec() documentation explicitly warns against attempting modifications to the default locals dictionary, as it may not reflect changes made within the exec() call.
The above is the detailed content of How Does the Behaviour of the `exec` Function Differ in Python 2 and Python 3?. For more information, please follow other related articles on the PHP Chinese website!