On Fri, Nov 9, 2012 at 5:37 PM, Steven D'Aprano <steve+comp.lang.pyt...@pearwood.info> wrote: > On Fri, 09 Nov 2012 17:07:09 +1100, Chris Angelico wrote: >> Can you enlighten us as to how this is better than either: >> x := -x >> or >> x := 0 - x >> ? I'm not seeing it. > > I'm hoping that Mark intended it as an example of crappy code he has > spotted in some other language rather than a counter-example of something > you would do.
Ohh. Yeah, that figures. Huh. > To be pedantic... there may very well be some (rare) cases where you > actually do want x -= x rather than just x = 0. Consider the case where x > could be an INF or NAN. Then x -= x should give x = NAN rather than zero. > That may be desirable in some cases. > > At the very least, the compiler should NOT optimize away x = x - x to > x = 0 if x could be a float, complex or Decimal. Yep. In the specific case of integers, though, and in the specific instance of CPU registers in assembly language, it's reasonable to optimize it the *other* way - MOV reg,0 is a one-byte opcode and 1, 2, or 4 bytes of immediate data, while SUB reg,reg (or XOR reg,reg) is a two-byte operation regardless of data size. But that's microoptimization that makes, uhh, itself-subtracted-from-itself sense in Python. >> And I'm not seeing any nonnumeric that would >> benefit from being subtracted from itself twice (strings, arrays, sets, >> you can subtract them from one another but not usefully more than once). > > How do you subtract strings? The same way you subtract sets. Same with arrays. Python doesn't do either, but Python also doesn't do the ":=" operator that the example code demonstrated, so I didn't assume Python. Pike v7.8 release 700 running Hilfe v3.5 (Incremental Pike Frontend) > "Hello, world!"-"l"; (1) Result: "Heo, word!" > ({1,2,3,3,2,3,1,2,1})-({2}); (2) Result: ({ /* 6 elements */ 1, 3, 3, 3, 1, 1 }) Python spells it differently: >>> "Hello, world!".replace("l","") 'Heo, word!' Not sure how to do array subtraction other than with filter: >>> list(filter(lambda x: x!=2,[1,2,3,3,2,3,1,2,1])) [1, 3, 3, 3, 1, 1] But there's probably a way (list.remove only takes out the first occurrence, so it's not equivalent). In any case, subtracting something from _itself_ is only going to give you an empty string, array, set, or whatever, and doing so a second time is going to achieve nothing. Hence my comment. But poor code we will always have with us, to paraphrase the Gospel of Matthew. ChrisA -- http://mail.python.org/mailman/listinfo/python-list