"Neil Cerutti" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] | 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 -- http://mail.python.org/mailman/listinfo/python-list