[Python-Dev] List mutation in list_repr?
Random832
random832 at fastmail.com
Tue Dec 6 11:32:27 EST 2016
On Tue, Dec 6, 2016, at 05:27, Patrick Westerhoff wrote:
> Hey all,
>
> I just stumbled on the following comment in the C source of the repr
> implementation for the list object:
>
> /* Do repr() on each element. Note that this may mutate the list,
> so must refetch the list size on each iteration. */
>
> (as seen in list_repr implementation [1])
>
> I’m honestly very surprised about this remark since I can neither
> understand why this would be the case (repr shouldn’t mutate the
> list)
It *shouldn't*, but it can't be enforced. It's one of those things where
if Python assumes all user code is sane (in this case, overridden
__repr__ not messing with the list) it can bite in a way that could
cause the interpreter to crash.
>>> class EvilClass:
... def __repr__(x):
... l.pop()
... return 'x'
...
>>> l = [EvilClass()]*10
>>> l
[x, x, x, x, x]
>, and I also don’t see any clue in the source as to when this
> would actually happen. Since inside the loop, the list object `v` is
> never accessed other than passing `v->ob_item[i]` to the recursive
> repr call, there shouldn’t be any mutation on the list object itself.
The item may have or be able to a reference to the list object
otherwise, as I demonstrated.
More information about the Python-Dev
mailing list