"If a worker wants to do his job well, he must first sharpen his tools." - Confucius, "The Analects of Confucius. Lu Linggong"
Front page > Programming > How does the `exec` function behave differently in Python 2 and Python 3?

How does the `exec` function behave differently in Python 2 and Python 3?

Published on 2024-11-19
Browse:141

How does the `exec` function behave differently in Python 2 and Python 3?

Behavior of exec Function in Python 2 and Python 3

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.

Python 2 Behavior

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.

Python 3 Behavior

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.

Correct Workaround

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.

Sample Code

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.

Latest tutorial More>

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