Частина запитання щодо індексів поза межами асортименту
Логіка зрізу автоматично відсікає індекси на довжину послідовності.
Дозволяючи індексам зрізів розширювати минулі кінцеві точки, це було зроблено для зручності. Було б боляче, коли б потрібно було перевіряти діапазон кожного виразу, а потім регулювати обмеження вручну, тому 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.