s[i:j:t] = t stipulation
Terry Reedy
tjreedy at udel.edu
Tue Nov 20 18:27:56 EST 2007
"Neil Cerutti" <horpner at yahoo.com> wrote in message
news:slrnfk65hp.1mk.horpner at FIAD06.norwich.edu...
| s[i:j:t] = t (1) t must have the same length as the slice it is
replacing.
This is essentially the same rule as requiring a proper length of t for
a,b,c = t # for whatever number of targets
And people have made similar suggestions as below for that case also.
| Why?
A mismatch could be intentional or accidental. In most cases of this sort,
Python assumes 'accident', especially when intent can easily be indicated
otherwise.
| >>> 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.
Use the appropriate itertools function to take the proper number of
elements.
| 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]
No, it should be defined as resulting in
['a', 1, 'a', 2, 'a', 3, None, 5, None, 7, None, 9] # ;-)
Or better yet, require the programmer to specify by modifying either the
target or source spec, as is done now.
Terry Jan Reedy
More information about the Python-list
mailing list