Частина запитання щодо індексів поза межами асортименту
Логіка зрізу автоматично відсікає індекси на довжину послідовності.
Дозволяючи індексам зрізів розширювати минулі кінцеві точки, це було зроблено для зручності. Було б боляче, коли б потрібно було перевіряти діапазон кожного виразу, а потім регулювати обмеження вручну, тому Python робить це за вас.
Розглянемо варіант використання бажання відображати не більше перших 50 символів текстового повідомлення.
Простий спосіб (що робить Python зараз):
preview = msg[:50]
Або складний спосіб (перевірте ліміт самостійно):
n = len(msg)
preview = msg[:50] if n > 50 else msg
Вручну реалізувати цю логіку для коригування кінцевих точок було б легко забути, легко було б помилитися (оновлення 50 в двох місцях), було б багатослівним і було б повільним. Python переміщує цю логіку до своїх внутрішніх елементів, де вона є стислим, автоматичним, швидким і правильним. Це одна з причин, чому я люблю Python :-)
Частина запитання щодо невідповідності довжини призначень від довжини вводу
Оператор також хотів знати обгрунтування дозволу на призначення, наприклад, p[20:100] = [7,8]
коли ціль призначення має іншу довжину (80), ніж довжина даних заміщення (2).
Найпростіше побачити мотивацію за аналогією зі струнами. Розглянемо "five little monkeys".replace("little", "humongous")
. Зверніть увагу, що ціль "мало" має лише шість букв, а "гордо" - дев'ять. Ми можемо зробити те ж саме зі списками:
>>> s = list("five little monkeys")
>>> i = s.index('l')
>>> n = len('little')
>>> s[i : i+n ] = list("humongous")
>>> ''.join(s)
'five humongous monkeys'
Все це зводиться до зручності.
До введення методів copy () та clear () це були популярні ідіоми:
s[:] = []
t = u[:]
Навіть зараз ми використовуємо це для оновлення списків під час фільтрації:
s[:] = [x for x in s if not math.isnan(x)]
Сподіваюся, ці практичні приклади дають хороший погляд на те, чому нарізка працює так, як це робиться.
if i > sequence.length(): return sequence.slice(0, sequence.length()) else sequence.slice(0, n)
це точно те саме, що просто використанняsequence[:n]
в Python економить вам оператор if і 2 дзвінкиlength
.