sequence multiplied by -1

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Sat Sep 25 21:34:34 EDT 2010


On Sat, 25 Sep 2010 13:45:11 +0200, Thomas Jollans wrote:

> On Saturday 25 September 2010, it occurred to Yingjie Lan to exclaim:
>> Hi,
>> 
>> I noticed that in python3k, multiplying a sequence by a negative
>> integer is the same as multiplying it by 0, and the result is an empty
>> sequence. It seems to me that there is a more meaningful symantics.
> 
> Um...
> 
> for every list l and integer n >= 0:
>     len(l*n) == len(l)*n
> 
> Multiplying a list by a negative integer should produce a list of
> negative length, which does not exist. 

Look at the domain of your invariance. It says nothing about negative n, 
and nor should it.


> IMHO, the only correct behaviour
> would be to raise an exception, though one could argue that there are
> practical benefits for the operation to succeed for any integer operand.

Since lists of negative length don't exist, we're free to set the 
invariance to something which has a less restrictive domain and is more 
useful than raising an exception:

for every list l and integer n:
    len(l*n) == len(l)*max(0, n)


>> Simply put, a sequence multiplied by -1 can give a reversed sequence.
> 
> For that, we have slicing. A negative step value produces a reverse
> slice of the list. You can't argue that this makes sense, can you
> 
>>>> [1,2,3,4][::-1]
> [4, 3, 2, 1]
>>>> [1,2,3,4][::-2]
> [4, 2]

Why does it not make sense?


I'm more concerned that the simple idiom:

# list L must have at least 5 items, so extend it with None if needed
L.extend([None]*(5 - len(L))

would suddenly break with this proposal.


-- 
Steven



More information about the Python-list mailing list