On Thu, Mar 12, 2020 at 03:02:28PM -0000, Eric Wieser wrote:
TL;DR: should we make `del x` an expression that returns the value of `x`.
## Motivation
I noticed yesterday that `itertools.combinations` has an optimization for when the returned tuple has no remaining ref-counts, and reuses it - namely, the following code:
>>> for v in itertools.combinations([1, 2, 3], 1): ... print(id(v)) ... del v # without this, the optimization can't take place 2500926199840 2500926199840 2500926199840
[...]
My suggestion would be to make `del x` an expression, with semantics "unbind the name `x`, and evaluate to its value". This would allow:
>>> [id(del v) for v in itertools.combinations([1, 2, 3], 1)] [2500926200992, 2500926200992, 2500926200992]
Pity that locals() is so weird, because this works fine in module level code, but not inside comprehensions or functions: py> for v in combinations([1, 2, 3], 1): ... print(id(locals().pop('v'))) ... 3083202636 3083202636 3083202636 Mind you, I think that the cost of calling locals().pop is going to outweigh any hypothetical saving you get from reusing the object. -- Steven