Is 'everything' a refrence or isn't it?
Claudio Grondi
claudio.grondi at freenet.de
Thu Jan 5 07:52:25 EST 2006
Dan Sommers wrote:
> On Wed, 04 Jan 2006 22:38:06 -0500,
> "Stuart D. Gathman" <stuart at bmsi.com> wrote:
>
>
>>On Wed, 04 Jan 2006 10:54:17 -0800, KraftDiner wrote:
>>
>>>I was under the assumption that everything in python was a refrence...
>>>
>>>so if I code this:
>>>lst = [1,2,3]
>>>for i in lst:
>>>if i==2:
>>>i = 4
>>>print lst
>>>
>>>I though the contents of lst would be modified.. (After reading that
>>>'everything' is a refrence.)
>>>...
>>>Have I misunderstood something?
>
>
>>It might help to do a translation to equivalent C:
>
>
>>int _i1 = 1;
>>int _i2 = 2;
>>int _i3 = 3;
>>int _i4 = 4;
>>int* lst[NLST] = { &_i1,&_i2,&_i3 };
>
>
> Okay so far.
>
>
>>int _idx; /* internal iterator */
>>for (_idx = 0; _idx < NLST; ++_idx) {
>> int *i = lst[_idx];
>
>
> [snip]
>
> That's the C idiom
>
> for i in range(len(lst))
>
> we all complain about here. How about (untested):
>
> /*
> iterate over the list, binding i to each item in succession;
> _idx is internal to the interpreter;
> separate the definition of i from the assignment of i for clarity
> */
>
> int **_idx;
> for( _idx = lst; _idx < lst + NLST; ++_idx ) {
> int *i;
> i = *_idx;
>
> /* compare "the item to which i is bound" to "a constant" */
> if( *i == *(&_i2) )
> /* rebind i to _i4 */
> i = &_i4;
> }
>
>
>>for (_idx = 0; _idx < NLST; ++_idx)
>> printf("%d\n",*lst[_idx]);
>
>
> for( _idx = lst; _idx < lst + NLST; ++_idx ) {
> int *i = *_idx;
> printf( "%d\n", *i );
> }
>
> Regards,
> Dan
>
This code appears to me better than that original one, but it exceeds at
the moment my capacity to check it. Weren't it a good idea to use PyPy
to translate this Python code into C? It should exactly show how it
works, right?
I would be glad to hear how to accomplish this, because I have heard, it
is not easy to separate and use that part of PyPy which does the
translation.
Claudio
More information about the Python-list
mailing list