But while the Zen of Python limits on the number of obvious ways, the Zen of Python says nothing about the boundless freedom of unobvious ways.
Let's empty a list named bucket.
The most obvious way is to simply not. 99 times out of 100, you want to assign a new empty list rather than mutating the old.
bucket = []But let's say you really wanted to empty it, well the clearest way is clear:
bucket.clear()But even the docs say this is equivalent to:
del bucket[:]I guess that's crossing the obvious line. Of course, it may be more obvious than Norvig's "dumbell" operator:
bucket[:]=[]Actually the slice assignment can take any iterable, so our list can lift plates of many shapes:
bucket[:]={}If you don't want your list getting ripped and/or cut, maybe keep it warm with Norvig's ski hat:
bucket *=0The ski hat is of particular interest because it's using a very obvious list feature, much more commonly used than list.clear(). Nobody would bat an eye at:
bucket = [0, 1, 2, 3] * 2If you multiply any list by 0, you make a new list of length 0. Bizarrely, this is actually true of any multiplier less than 0, too.
# bucket = [0, 1, 2, 3, 0, 1, 2, 3]
bucket *= -3Safe to say we are deep in the territory of the unobvious. Is there a syntax we might meditate on to take us further?
# bucket = []
There's also
ReplyDeletebucket *= False
just to complicate things further.
I think that's just because False is the equivalent of 0 in python? So, I guess it doesn't complicate it much.
DeleteI'm not sure about the answer, but you certainly can't say that "False is the equivalent of 0 in python". You could say that in languages like C, or loosely typed language like php.
DeleteIn Python, `False == 0`, but `False is not 0`. Because `issubclass(bool, int)`, False and True act like 0 and 1 in a numerical context.
Delete{0: 'bar', False: 'bar', 1.0: 'bar'}
ReplyDelete