Hrvoje Niksic wrote: > greg <[EMAIL PROTECTED]> writes: > > > none wrote: > >> IIRC, I once saw an explanation how Python doesn't have > >> "variables" in the sense that, say, C does, and instead has bindings > >> from names to objects. > >
IMHO, this is nonsense. All that variables are (in any language) are "bindings" for names. Pretending python does anything novel with regard to "variables" is confusing and, ultimately, simply results in a redefinition of terms programmers are already familiar with. I mean, it's kind of like saying my computer is not a computer but is actually a device that follows input directions. Of course that description may be true (and I may even use it to explain to students *what* a computer is), but it is no less a computer for it. > > If you're talking to C programmers, just tell them that Python > > variables always contain pointers. That should give them the right > > mental model to build on. > > That is a convenient shortcut when it works, but in my experience it > tends to confuse the issue. The reason is that one of the main uses > of pointers in C is implementing pass-by-reference. A C programmer > told that Python variables internally hold pointers expects this code: > I think most C programmers are smart enough to figure out the supposed differences, with only a little additional explanation on the part of the instructor. Python's "variable model" is practically identical to that of Java, after all, and I don't recall any discussion of cataclysmic proportions over the differences between C "pointers" and Java "references". There are "differences" (or more accurately "points of emphasis"), but of the sort that take a paragraph or two of explanation/clarification -- not a completely new model. > def func(a): > a = 10 > ... > func(x) > > to change the value of x. Depends on how you implement the C "equivalent". The most direct translation, IMHO, is the following: void func(int *a){ a = 10; //Of course this is nonsense, but it illustrates the point. Just because "a" is a pointer //does not mean that "a" is not rebound when it is assigned to. Oh wait! Did I use //the word "rebound" when talking about a *C* variable? ;-) //*a = 10; //I'm guessing this is what *you* had in mind, but it is very different } int main(int argc, char **argv){ int x = 5; func(&x); printf("x is: %i\n", x); return 0; } Which prints: x is: 5 In this case, both the C and Python code have the same result. --Nathan Davis -- http://mail.python.org/mailman/listinfo/python-list