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.
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3