By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
443,660 Members | 1,187 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 443,660 IT Pros & Developers. It's quick & easy.

behavior difference for mutable and immutable variable in function definition

P: n/a
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

May 4 '07 #1
Share this Question
Share on Google+
5 Replies


P: n/a
ji***********@gmail.com 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:
pyx = object()
pyid(x)
1074201696
pyx = object()
pyid(x)
1074201704

Notice how the identity (id) of x changes.

James
May 4 '07 #2

P: n/a
On Fri, 2007-05-04 at 14:30 -0700, ji***********@gmail.com 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

May 4 '07 #3

P: n/a
On May 4, 3:30 pm, jianbing.c...@gmail.com 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

May 4 '07 #4

P: n/a
On May 4, 12:39 pm, 7stud <bbxx789_0...@yahoo.comwrote:
On May 4, 3:30 pm, jianbing.c...@gmail.com 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.
May 5 '07 #5

P: n/a
On May 4, 5:14 pm, Carsten Haese <cars...@uniqsys.comwrote:
On Fri, 2007-05-04 at 14:30 -0700, jianbing.c...@gmail.com 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.

May 5 '07 #6

This discussion thread is closed

Replies have been disabled for this discussion.