On 7/29/2021 5:39 AM, Unknown wrote:
Hello
Reading PEP572 about Python 3.9 assignment expressions,
I discovered a subtle difference between any(a list)
and any(a generator)
see:
>>> lines = ["azerty", "#qsdfgh", "wxcvbn"]
>>> any((comment := line).startswith('#') for line in lines)
True
>>> comment
"#qsdfgh"
>>> any([(comment := line).startswith('#') for line in lines])
Same as
>>> booleans = [(comment := line).startswith('#') for line in lines]
>>> # comment == last item.
>>> any(booleans) # Iteration though booleans stops at 1st True.
> True
>>> comment
'wxcvbn'
The two code snippets which seems very similar provide a
different value for "comment".
When "any" deals with a generator, it stops as soon it finds
a True value and returns True.
When "any" deals with a list, the whole list is calculated
first, and then "any" looks for a True.
Before 3.9 and the walrus operator, the two ways always provide
the same result, in a faster way with a generator.
Since the 'two ways' involve the new :=, I have no idea what 'two ways'
and 'same result' you mean before :=.
With 3.9 and the walrus operator, result can be different
--
Terry Jan Reedy
--
https://mail.python.org/mailman/listinfo/python-list