This doesn’t allow you to do anything new, it just saves you a few lines at the cost of new syntax. Explicit variable initialization is not a problem to be solved, IMO.
As to your last example:
from collections import defaultdict
sale = defaultdict(lambda: 0)
for p, q in zip(products, quantities):
sale[p] += q
Yes, defaultdict is one way for dicts. I think to have a generic syntax that covers every single variable type is still valuable, since you don’t need to remember how to handle each variable type.
This is a bug magnet. Consider this (rather silly) example:
stuff = [1, 4, 2, 8, 5, 7]
for num in stuff:
total = 0
for i in range(num):
total += num * i
print(num, total)
This is perfectly reasonable and easy to wrap your head around. Try defining reasonable semantics for the “initialize” semantics that won’t surprise people.
Note for this use case I generally opt for defaultdict(int) over Counter() because it is very slightly more performant. Just wanted to point it out though because Counter() is perhaps easier to remember.