[David Abrahams] >> I am about to write some code which relies on the following: >> >> x = (1,2,3) >> y = (1,2,3) >> d = {} >> d[x] = 1 >> d[y] = 1 >> assert d.keys()[0] is y >> >> In other words, when you do d[k] = v it replaces both v *and* k in >> the dict. I couldn't find it documented anywhere but the source. I >> submitted a doc patch which enshrines that behavior, but since Guido >> doesn't always know what's in the doc I wanted to make sure it was >> considered reasonable. >> >> Anyone want to tell me it's a bad idea? It seems like the more >> useful of the two possible behaviors to me. [Samuele Pedroni] > that's not the case with Jython, i.e. the assert will fail in Jython. It probably fails in CPython too: >>> x = (1, 2, 3) >>> y = (1, 2, 3) >>> d = {x: 1} >>> d[y] = 1 >>> map(id, d.keys()) # shows that x is still a key [7872560] >>> id(x), id(y) (7872560, 8348336) >>> Dave, what made you think x gets replaced? > Dicts are equality not identity dicts so both behavior, as I see it, > are fine. In the end what happens with the fragment is unspecified. Well, it is specified that after d[k] = v then d[k'] == v' for any pair (k', v') such that assert k == k' and v == v' holds, and k' is hashable, and type(k) and type(k') meet the requirement that objects that compare equal also have equal hash codes. Or at least that's virtually specified <wink>.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4