Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > behavior difference for mutable and immutable variable in function definition

Reply
Thread Tools

behavior difference for mutable and immutable variable in function definition

 
 
jianbing.chen@gmail.com
Guest
Posts: n/a
 
      05-04-2007
Hi,

Can anyone explain the following:

Python 2.5 (r25:51908, Apr 9 2007, 11:27:23)
[GCC 4.1.1 20060525 (Red Hat 4.1.1-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def foo():

.... x = 2
....
>>> foo()
>>> def bar():

.... x[2] = 2
....
>>>
>>> bar()

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in bar
NameError: global name 'x' is not defined

Thanks,
Jianbing

 
Reply With Quote
 
 
 
 
James Stroud
Guest
Posts: n/a
 
      05-04-2007
http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:
> Hi,
>
> Can anyone explain the following:
>
> Python 2.5 (r25:51908, Apr 9 2007, 11:27:23)
> [GCC 4.1.1 20060525 (Red Hat 4.1.1-1)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
>
>>>>def foo():

>
> ... x = 2
> ...
>
>>>>foo()
>>>>def bar():

>
> ... x[2] = 2
> ...
>
>>>>bar()

>
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "<stdin>", line 2, in bar
> NameError: global name 'x' is not defined
>
> Thanks,
> Jianbing
>


1. Each function call creates its own namespace, so "x" in foo() is
"isolated" from the global namespace or from calls of bar().
2. Think of assignment as assigning a name to a value rather than
"putting a value" into the name. When you assign, you completely change
the identity of name, rather than changing the contents of the name.

For example:


py> x = object()
py> id(x)
1074201696
py> x = object()
py> id(x)
1074201704

Notice how the identity (id) of x changes.

James
 
Reply With Quote
 
 
 
 
Carsten Haese
Guest
Posts: n/a
 
      05-04-2007
On Fri, 2007-05-04 at 14:30 -0700, (E-Mail Removed) wrote:
> Hi,
>
> Can anyone explain the following:
>
> Python 2.5 (r25:51908, Apr 9 2007, 11:27:23)
> [GCC 4.1.1 20060525 (Red Hat 4.1.1-1)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> def foo():

> ... x = 2
> ...
> >>> foo()
> >>> def bar():

> ... x[2] = 2
> ...
> >>>
> >>> bar()

> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "<stdin>", line 2, in bar
> NameError: global name 'x' is not defined


"x = 2" binds the name 'x' in foo's local namespace to the object '2'.
For this, it doesn't matter whether the name 'x' was previously bound to
anything.

"x[2] = 2" is a shorthand notation for the method call
"x.__setitem__(2,2)". This requires the name 'x' to be bound to some
object that has a __setitem__ method.

-Carsten

 
Reply With Quote
 
7stud
Guest
Posts: n/a
 
      05-04-2007
On May 4, 3:30 pm, (E-Mail Removed) wrote:
> Hi,
>
> Can anyone explain the following:
>
> Python 2.5 (r25:51908, Apr 9 2007, 11:27:23)
> [GCC 4.1.1 20060525 (Red Hat 4.1.1-1)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.>>> def foo():
>
> ... x = 2
> ...>>> foo()
> >>> def bar():

>
> ... x[2] = 2
> ...
>
> >>> bar()

>
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "<stdin>", line 2, in bar
> NameError: global name 'x' is not defined
>
> Thanks,
> Jianbing


The first function is completely irrelevant unless you expect this to
work:

x = 2
x[2] = 2

Traceback (most recent call last):
File "test1.py", line 2, in ?
x[2] = 2
TypeError: object does not support item assignment

So that leaves you with:

> >>> def bar():

>
> ... x[2] = 2
> ...
>
> >>> bar()


Would you expect this to work:

x[2] = 2
print x



 
Reply With Quote
 
Roger Miller
Guest
Posts: n/a
 
      05-05-2007
On May 4, 12:39 pm, 7stud <(E-Mail Removed)> wrote:
> On May 4, 3:30 pm, (E-Mail Removed) wrote:
>
>
>
> > Hi,

>
> > Can anyone explain the following:

>
> > Python 2.5 (r25:51908, Apr 9 2007, 11:27:23)
> > [GCC 4.1.1 20060525 (Red Hat 4.1.1-1)] on linux2
> > Type "help", "copyright", "credits" or "license" for more information.>>> def foo():

>
> > ... x = 2
> > ...>>> foo()
> > >>> def bar():

>
> > ... x[2] = 2
> > ...

>
> > >>> bar()

>
> > Traceback (most recent call last):
> > File "<stdin>", line 1, in <module>
> > File "<stdin>", line 2, in bar
> > NameError: global name 'x' is not defined

>
> > Thanks,
> > Jianbing

>
> The first function is completely irrelevant unless you expect this to
> work:
>
> x = 2
> x[2] = 2
>
> Traceback (most recent call last):
> File "test1.py", line 2, in ?
> x[2] = 2
> TypeError: object does not support item assignment
>
> So that leaves you with:
>
> > >>> def bar():

>
> > ... x[2] = 2
> > ...

>
> > >>> bar()

>
> Would you expect this to work:
>
> x[2] = 2
> print x


I will sympathize with the OP to the extent that the message "global
name 'x' is not defined" is a bit misleading. All that the interpreter
really knows is that 'x' is not defined, locally or globally, and it
should probably not presume to guess the coder's intention.


 
Reply With Quote
 
jianbing.chen@gmail.com
Guest
Posts: n/a
 
      05-05-2007
On May 4, 5:14 pm, Carsten Haese <(E-Mail Removed)> wrote:
> On Fri, 2007-05-04 at 14:30 -0700, (E-Mail Removed) wrote:
> > Hi,

>
> > Can anyone explain the following:

>
> > Python 2.5 (r25:51908, Apr 9 2007, 11:27:23)
> > [GCC 4.1.1 20060525 (Red Hat 4.1.1-1)] on linux2
> > Type "help", "copyright", "credits" or "license" for more information.
> > >>> def foo():

> > ... x = 2
> > ...
> > >>> foo()
> > >>> def bar():

> > ... x[2] = 2
> > ...

>
> > >>> bar()

> > Traceback (most recent call last):
> > File "<stdin>", line 1, in <module>
> > File "<stdin>", line 2, in bar
> > NameError: global name 'x' is not defined

>
> "x = 2" binds the name 'x' in foo's local namespace to the object '2'.
> For this, it doesn't matter whether the name 'x' was previously bound to
> anything.
>
> "x[2] = 2" is a shorthand notation for the method call
> "x.__setitem__(2,2)". This requires the name 'x' to be bound to some
> object that has a __setitem__ method.
>
> -Carsten


This makes sense.

Thank you.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Immutable and Mutable Types Bernard Lim Python 16 03-19-2008 04:47 AM
Bizarre behavior with mutable default arguments bukzor Python 37 01-02-2008 10:56 AM
Behavior of mutable class variables tkpmep@hotmail.com Python 6 05-09-2007 11:23 PM
Why mutable/immutable can't be valid class qualifier? hiwa Java 4 03-08-2006 04:46 PM
Newbie question: Returning mutable vs. immutable pugnatio2@yahoo.com Python 2 04-15-2004 02:57 PM



Advertisments