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), 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. I understand that a custom repr implementation could theoretically mutate an object, but this could only affect the object itself (or its children), but not the container list. So the list object `v` here should be safe from mutations. I tried looking at the original change when this was introduced. Unfortunately, this was in 2001 [2], so I don’t really expect Tim to still know *why* the comment was added back then. Do you have any insights on why the comment is there, and whether I am missing something that could actually mutate the list, making the size refetch necessary and the comment justified? Thanks a lot! Patrick [1] https://github.com/python/cpython/blob/b8519e4d08a82da9aa438d531058100c0e3d04b4/Objects/listobject.c#L361 [2] https://github.com/python/cpython/commit/bce15a39b30b0f5866e7b48ba3c29c3aa430a766 _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com