On Mon, Mar 28, 2011 at 3:23 PM, Michael H. Goldwasser <goldw...@slu.edu>wrote:

>
>
> Note well that the issue has changed since the original post.  The
> question at the time concerned the following code
>
>
Not to quibble, but the issue of the *original* post had to do with
assignments (such as those below) dynamically mutating an
"environment dict" named globals().

What this function returns varies moment to moment as a side
effect of new assignment operations top level, or deletions.

dir(), on the other hand, returns a snapshot, a "static" list
(not that lists are static in the sense of immutable -- not
what I meant).

One could imagine a globals() that *did* return a snapshot,
as dict(globals()) does.

>>> g = dict(globals())
>>> for k,v in g.items(): print(k,v, sep=":")  # no problemo

__builtins__:<module 'builtins' (built-in)>
__name__:__main__
__doc__:None
__package__:None



 >>> a = 1
> >>> b = a  # b and a are two different 1s
>
> Carl correctly points out that b and a are not two different 1s in
> this case. The assignment statment of a = b has the same semantics for
> integers as it does for any other data type.  a and b become aliases
> for the same underlying instance.  On any platform, it will be the
> case that
>
> >>> a is b
> True
>
> folowing that assignment.


Very true and related to Python's bias against unnecessary
copying, making copy (as a verb) live inside its own module
(like in a dog house) not even present as a built-in.

This is because names are light and airy whereas the objects
they name on the heap may be gargantuan, in terms of
resources used.

green = Giant( ); red = green should not inadvertently
cause two instances of Giant, with copying a side effect
of assignment.

As a language, Python is refreshingly consistent about
not doing that.


> The original misunderstanding involved the
> semantics of b += 2; that command does not mutate the underlying
> instance, but re-associates the identifier b to a new value (while a
> remains associated with the value 1).
>

Likewise I get students talking about how "hello world".upper( )
is "transforming" a string, whereas more accurately its
returning a new string instance that's based on "hello world"
-- like transcribing DNA, building a protein.

So is "transcribing" to go back to inadvertent copying?

No, because a = "hello world"; b = a.upper( ) is about
creating two different strings, each with its own name.

No copies here.


>
> In your reply, the code fragment (below) shows a different issue
> regarding the re-use of integer literals in source code (as you
> assigned b=1 rather than b=a).  In that case, it is system-dependent
> whether the interpretter uses different instances or the same
> instance, and you are right that there is no guarantee that equivalent
> instances will be identical instances.
>

>>> (17 + 1) is 18
True

>>> 8243985209384708709180298734 is (8243985209384708709180298733 + 1)
False

Implementation details...

Kirby


>
> With regard,
> Michael
>
> >
> >    Python 2.6.6
> >    Type "help", "copyright", "credits" or "license" for more information.
> >    >>> w = 1
> >    >>> y = 1
> >    >>> w is y  # this might surprise you
> >    True
> >
> >    [PyPy 1.4.1]
> >    Type "help", "copyright", "credits" or "license" for more information.
> >
> >    >>>> w = 1
> >    >>>> y = 1
> >    >>>> w is y # or are you so used to CPython that this surprises you?
> >    False
>
_______________________________________________
Edu-sig mailing list
Edu-sig@python.org
http://mail.python.org/mailman/listinfo/edu-sig

Reply via email to