From: Jacob S. <sch...@ro...> - 2009-09-12 21:05:01
|
There are many reasons for this type of behavior. And there are two sides to this coin. A) Why would you want the names to be references of an object? Imagine you want to pass a custom object into a function. Python doesn't know how to pass it in by value -> it is a distinct instance. For example -> you make a Rational class that you can use for rational number arithmetic. What are you supposed to do when you add two of them together? Change the first one? Change the second one? Make a new one? Alright. That's simple enough. Make a new one. But what if you go deeper, make more complex functions, more complex objects? You can't make a new one every time you want to change something. That's time consuming AND memory consuming. B) Why can't you just copy and pass everything by value? How do you copy an object? Maybe for integers, it is a simple matter of copying the bits into a new object and you're done. How do you copy a list? Do you copy the references of all the items in the list to the new list, or do you try to copy recursively all the items in the list? How do you copy a custom object? What if that object is based on dynamic data? Each object should have a unique identifier, right? But that sometimes defeats the point of the copy. You want the two objects to be identical. Python was written in such a way that it balances these arguments. Tuples and lists are separate entities because they behave differently and are used in the situations for which they are best suited. Assignment just creates a new reference because it is the cheapest quickest way to do it, and in most situations it works. On Sat, 2009-09-12 at 15:07 -0400, Bruce Sherwood wrote: > None of us readers of this mailing list participated in the creation of Python, > so I doubt that anyone here can tell you why Python is built that way, nor argue > the merits of the case. Nor was the intent of the experienced.html article to > explain this behavior, only to alert you to it. > > As for utility of this behavior: It's a bit of a stretch for me, but I can > imagine a situation where you want to refer to some very long name by using a > short name, as in > > s = the_sphere_whose_outer_surface_represents_Earth = sphere() > s.pos = vector(10,20,30) > > I tried a little googling to find some history and found this laconic comment: > > "It is not weird in Python. Implicit copies are never made, partly > because it's very hard to implement it correctly for every object." > > Also, http://merd.sourceforge.net/inoutness.html seems to summarize these issues > for diverse programming languages. > > Bruce Sherwood > > Lenore Horner wrote: > > > >> http://vpython.org/contents/experienced.html > > > > I'm sorry to say that it was entirely unenlightening. The only relevant > > statement seems to be this "Making a second, independent copy of an > > object is a fairly unusual thing to do in Python, but there exist > > special methods for doing this." But there is zilch explanation of why > > this is so. I repeat: why ever would I want two identical objects that > > _must remain so forever_ ? I completely fail to grasp the utility of > > this concept. I cannot think of a single thing that I can accomplish > > with two identical objects that I cannot accomplish with only one of them. > > > > Sorry to be so boneheaded about this, but I just don't get it. > > > > Lenore > > ------------------------------------------------------------------------------ > Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day > trial. Simplify your report design, integration and deployment - and focus on > what you do best, core application coding. Discover what's new with > Crystal Reports now. http://p.sf.net/sfu/bobj-july > _______________________________________________ > Visualpython-users mailing list > Vis...@li... > https://lists.sourceforge.net/lists/listinfo/visualpython-users > |