Oddity in 2.4 with eval('None')

Steve Holden steve at holdenweb.com
Mon Dec 20 21:17:12 CET 2004


Leif K-Brooks wrote:

> In Python 2.4, although None can't be directly assigned to, 
> globals()['None'] can still be; however, that won't change the value of 
> the expression "None" in ordinary statements. Except with the eval 
> function, it seems:
> 
> Python 2.4 (#2, Dec  3 2004, 17:59:05)
> [GCC 3.3.5 (Debian 1:3.3.5-2)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
>  >>> print None
> None
>  >>> print eval('None')
> None
>  >>> globals()['None'] = "spam"
>  >>> print None
> None
>  >>> print eval('None')
> spam
> 
> I don't really mind this weird behavior; I'm just curious about it. Does 
> anyone know what might be going on in Python's internals to cause the 
> difference between "print None" and "print eval('None')"?

Yes. "print eval('None')" is printing the value of None as defined in 
your module's global namespace:

Python 2.4 (#1, Dec  4 2004, 20:10:33)
[GCC 3.3.3 (cygwin special)] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
  >>> import sys
  >>> globals()['None'] = "FooBar"
  >>> print sys.modules["__main__"].None
FooBar
  >>> print __builtins__.None
None
  >>> print eval("__builtins__.None")
None >>>

regards
  Steve
-- 
Steve Holden               http://www.holdenweb.com/
Python Web Programming  http://pydish.holdenweb.com/
Holden Web LLC      +1 703 861 4237  +1 800 494 3119



More information about the Python-list mailing list