[Python-Dev] [PEP] += on return of function call result (original) (raw)
Andrew Koenig ark@research.att.com
16 May 2003 08:07:23 -0400
- Previous message: [Python-Dev] [PEP] += on return of function call result
- Next message: [Python-Dev] [PEP] += on return of function call result
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
ark> Why can't you do this?
ark> for t in range(5): ark> for r in range(10): ark> foo = log.setdefault(r,'') ark> foo += "test %d\n" % t
Luke> after running this code,
Luke> log = {0: '', 1: '', 2:'', 3: '' ... 9: ''}
Luke> and foo equals "test 5".
Then that is what foo would be if you were able to write
log.setdefault(r,'') += "test %d\n" % t
as you had wished.
Luke> if, however, you do this:
Luke> for t in range(5): Luke> for r in range(10): Luke> foo = log.setdefault(r,[]) Luke> foo.append("test %d\n" % t)
Luke> then empirically i conclude that you DO end up with the Luke> expected results (but is this true all of the time?)
I presume that is because you are now dealing with vectors instead of strings. In that case, you could also have written
for t in range(5):
for r in range(10):
foo = log.setdefault(r,[])
foo += ["test %d]n" % t]
with the same effect.
Luke> the reason why your example, andrew, does not work, is Luke> because '' is a string - a basic type to which a pointer is Luke> NOT returned i presume that the foo += "test %d"... returns a Luke> DIFFERENT result object such that the string in the dictionary Luke> is DIFFERENT from the string result of foo being updated.
Well, yes. But that is what you would have gotten had you been allowed to write
log.setdefault(r,"") += <whatever>
in the first place.
Luke> if that makes absolutely no sense whatsoever then think of it Luke> being the difference between integers and pointers-to-integers Luke> in c.
I think this analogy is pointless, as the only people who will understand it are those who didn't need it in the first place :-)
Luke> can anyone tell me if there are any PARTICULAR circumstances where
Luke> foo = log.setdefault(r,[]) Luke> foo.append("test %d\n" % t)
Luke> will FAIL to work as expected?
It will fail if your expectations are incorrect or unrealistic.
Luke> andrew, sorry it took me so long to respond: i initially Luke> thought that under all circumstances for all types of foo, Luke> your example would work.
But it does! At least in the sense of the original query.
The original query was of the form
Why can't I write an expression like f(x) += y?
and my answer was, in effect,
If you could, it would have the same effect as if you had written
foo = f(x)
foo += y
and then used the value of foo.
Perhaps I'm missing something, but I don't think that anything you've said contradicts this answer.
-- Andrew Koenig, ark@research.att.com, http://www.research.att.com/info/ark
- Previous message: [Python-Dev] [PEP] += on return of function call result
- Next message: [Python-Dev] [PEP] += on return of function call result
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]