* Jon Clements:

I read the OP as homework (I'm thinking Scott did as well),

Sorry. Need to recalibrate that neural network. Back-propagation initiated... Done! :-)


however,
your code would be much nicer re-written using collections.defaultdict
(int)... which I don't think is giving anything away...

Thanks!

This sent me searching everywhere, because the documentation of '+=' and other "augmented assignment statements" says

  "The target is only evaluated once.",

like in C++, which implies a kind of reference to mutable object.

I couldn't immediately see how subscription could apparently return a reference to mutable int object in Python in a way so that it worked transparently (the idiom in C++).

However, it worked to replace collections.defaultdict with a class overriding __getitem__ and __setitem__, so I guess that's how it works, that in this case '+=' is simply translated like 'x += n' -> 'temp = x; x = temp + n'.

Is this a correct understanding, and if so, what exactly does the documentation mean for the general case?

E.g.

def foo():
    print( "foo" )
    d = dict(); d[43] = 666
    return d

def bar():
    print( "bar" )
    return 43;

foo()[bar()] += 1

produces

  foo
  bar

so here it's not translated like 'foo()[bar()] = foo()[bar()] + 1' but evidently more like 'a = foo(); i = bar(); a.__setitem__(i, a.__getitem__(i) + 1)'?

If so, is this behavior defined anywhere?

I did find discussion (end of ยง6.2 of the language reference) of the case where the target is an attibute reference, with this example:

class A:
    x = 3    # class variable
a = A()
a.x += 1     # writes a.x as 4 leaving A.x as 3

:-)


Cheers, & thanks,

- Alf
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to