The exec function exhibits distinct behavior between Python 2 and Python 3. In Python 2, exec is a statement, while in Python 3, it has transitioned into a function. This distinction has significant implications for its interaction with local variables.
In Python 2, the exec statement allows the modification of local variables within a function's scope. When the exec statement is executed, the Python compiler temporarily disables local scope optimizations and switches to a slower lookup strategy to access both local and global variables. Additionally, any variables declared within the exec statement are automatically copied back to the function's locals if no explicit globals and locals parameters are provided.
In Python 3, the exec() function strictly follows the rules of function scope. It can no longer modify variables in the local scope of a function, even if they were previously declared. Locals() is capable of reflecting local variables in one direction, but allowing modifications through locals() has never been supported.
To achieve the desired behavior observed in Python 2, it is necessary to utilize a separate namespace when calling exec() in Python 3. By passing a custom dictionary to the exec() function, it is possible to modify and access variables within that namespace.
The following code demonstrates the proper way to use exec() in Python 3:
def execute(a, st): namespace = {} exec("b = {}\nprint('b:', b)".format(st), namespace) print(namespace['b'])
This approach ensures that the local scope of the function remains intact, while still allowing modifications to variables within the defined namespace.
The above is the detailed content of How does the `exec` function behave differently in Python 2 and Python 3?. For more information, please follow other related articles on the PHP Chinese website!