¿Cómo la función eval () cambia el dict?

¿Cómo eval () cambia el dict? Este es un ejemplo: crear un dict -> imprimir -> eval -> imprimir

>>> a={'a':'a','b':'b'} >>> print(a) {'a': 'a', 'b': 'b'} >>> eval('a == "a"',a) True >>> print(a) {'a': 'a', '__builtins__': {'bytearray': , 'IndexError': , 'all': , 'help': Type help() for interactive help, or help(object) for help about object., 'vars': , 'SyntaxError': , 'UnicodeDecodeError': , 'memoryview': , 'isinstance': , '__build_class__': , 'copyright': Copyright (c) 2001-2012 Python Software Foundation. All Rights Reserved. ... 

El segundo argumento de eval() son los globales utilizados para la expresión ejecutada por eval() .

Una de las cosas que Python hace cuando evalúa una expresión es asegurarse de que las incorporaciones de python estén disponibles para la expresión evaluada, y para eso agrega la entrada __builtins__ a ese espacio de nombres __builtins__ .

Entonces, sí, la llamada eval() cambió su diccionario, y eso es un comportamiento normal y esperado. Incluso lo dice en la documentación de la función:

Si el diccionario global está presente y carece de ‘__builtins__’, las variables globales actuales se copian en las globales antes de que se analice la expresión . Esto significa que la expresión normalmente tiene acceso completo al módulo __builtin__ estándar y los entornos restringidos se propagan.

Si desea evitar este cambio, use un dict vacío para los globales, y use a como el espacio de nombres de los locals lugar:

 eval('a == "a"', {}, a) 

La respuesta reside en el doc !

En primer lugar, el segundo parámetro a eval es el diccionario global . Que, vemos:

Si el diccionario global está presente y carece de ‘__builtins__’, las variables globales actuales se copian en las globales antes de que se analice la expresión.

Así que sí, tu diccionario se modifica por la llamada a eval .

Si lo hace El segundo argumento de eval() es el diccionario “globales”, que explica lo que estás viendo.