s[i:j:t] = t stipulation
Neil Cerutti
horpner at yahoo.com
Tue Nov 20 13:08:44 EST 2007
s[i:j:t] = t (1) t must have the same length as the slice it is
replacing.
Why?
>>> def foo():
... while True:
... yield 'a'
...
>>> foo()
>>> x = range(10)
>>> x[::2] = foo()
This is infinite loop due to Python building a sequence out of
the iterator to check its length.
I think it might be more useful for
x[::2] = foo()
to result in an x of
['a', 1, 'a', 3, 'a', 5, 'a', 7, 'a', 9]
In other words, take (j-i)//k elements from t for abs(k) != 1.
A problem, though, arises when t is too short--the sequence
could be corrupted before an exception is thrown if you omit the
length check.
So you'd also have to define
x[::2] = 'aaa'
as resulting in
['a', 1, 'a', 2, 'a', 3, 5, 7, 9]
But perhaps that's just adding more useless complexity to the
already complex slicing rules (kudos for 'slice.indices', though
curses that the method isn't cross-referenced in more places).
--
Neil Cerutti
More information about the Python-list
mailing list