Dan Sommers wrote: > On Wed, 04 Jan 2006 22:38:06 -0500, > "Stuart D. Gathman" <[EMAIL PROTECTED]> 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 -- http://mail.python.org/mailman/listinfo/python-list