On Wed, 09 Aug 2006 15:11:16 -0300
Gerhard Fiedler <[EMAIL PROTECTED]> wrote:

#> On 2006-08-09 07:54:21, Slawomir Nowaczyk wrote:
#> 
#> > Nope. Equivalence table can look like this:
#> > 
#> >        Python                             C
#> > variable:                a          variable:              a
#> > textual representation: "a"         address operator:     &a
#> > id of object:           id(a)       dereference operator: *a
#> > 
#> > Also, notice, that "id(a)" does not really "identify" a variable. It
#> > only identifies *object* which is bound to this variable. Both in
#> > Python and in C.
#> 
#> Rests one question: what is the value of the variable? In Python, it would
#> be the result of "a". In C, it would be the result of ...? 

Hmmm, well, it should be value of a, but it clearly doesn't make much
sense. It seems like I got confused and was saying something else than
I was thinking.

So, indeed, you were right: this analogy is broken.

But let me try again, please (just one more time, if this doesn't work
either I am willing to admit I do not see a simple analogy between
Python and C variables :-)

       Python                             C
variable:               a            variable:              a
value of variable:      eval("a")    dereference operator: *a
textual representation: "a"          address operator:     &a
id of object:           id(a)        value of variable:     a

Thus, equivalent operations would be:

       Python                             C
a = 1003                             a = &three  // (1)
id(a)                                a
b = 1004                             b = &four
a == b          # False              *a == *b    // false
id(a) == id(b)  # False              a == b      // false
b = a                                b = a     
a == b          # True               *a == *b    // true
id(a) == id(b)  # True               a == b      // true
a = 1001+1002                        a = MallocNewIntFromValue( one+two )
a == b          # True               *a == *b    // true
id(a) == id(b)  # False / True (2)   a == b      // false / true
a = 1003+1004                        a = MallocNewIntFromValue( three+four )
a == b          # False              *a == *b    // false
id(a) == id(b)  # False              a == b      // false


(1) one, two, three and four are constants, something like "const int
    one = 1". That is because there is no "literal int object" in C
    - the thing you would write as "1" is likely not to actually
    exist at runtime. And you cannot take an address of it.

(2) is actually True in CPython implementation for small integers, but
    that's a minor detail. MallocNewIntFromValue might cache objects
    as well.

-- 
 Best wishes,
   Slawomir Nowaczyk
     ( [EMAIL PROTECTED] )

Housework can't kill you... but why take a chance?

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to