behavior difference for mutable and immutable variable in function definition

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • jianbing.chen@gmail.com

    #1

    behavior difference for mutable and immutable variable in function definition

    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

  • James Stroud

    #2
    Re: behavior difference for mutable and immutable variable in functiondefinit ion

    jianbing.chen@g mail.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

    Comment

    • Carsten Haese

      #3
      Re: behavior difference for mutable and immutable variable infunction definition

      On Fri, 2007-05-04 at 14:30 -0700, jianbing.chen@g mail.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

      Comment

      • 7stud

        #4
        Re: behavior difference for mutable and immutable variable in function definition

        On May 4, 3:30 pm, jianbing.c...@g mail.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.>>d ef 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



        Comment

        • Roger Miller

          #5
          Re: behavior difference for mutable and immutable variable in function definition

          On May 4, 12:39 pm, 7stud <bbxx789_0...@y ahoo.comwrote:
          On May 4, 3:30 pm, jianbing.c...@g mail.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.>>d ef 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.


          Comment

          • jianbing.chen@gmail.com

            #6
            Re: behavior difference for mutable and immutable variable in function definition

            On May 4, 5:14 pm, Carsten Haese <cars...@uniqsy s.comwrote:
            On Fri, 2007-05-04 at 14:30 -0700, jianbing.c...@g mail.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.

            Comment

            Working...