Python: удаление негативов из списка чисел
Когда выполняется remove_negs([1, 2, 3, -3, 6, -1, -3, 1]) , результат: [1, 2, 3, 6, -3, 1] . Результат должен быть [1, 2, 3, 6, 3, 1] . что происходит, если в строке есть два отрицательных числа (например, -1, -3 ), то второе число не будет удалено. def main(): numbers = input ( «Введите список номеров:» ) remove_negs (номера)
7 ответов
Как правило, плохая идея удалить элементы из списка, итерации по нему (см. ссылка в моем комментарии для объяснения относительно почему это так). Лучшим подходом было бы использовать понимание :
Обратите внимание, что приведенная выше строка создает новый список и присваивает ему num_list . Вы также можете выполнить «на месте» присвоение формы
который не создает новый список в памяти, а вместо этого изменяет местоположение памяти, на которое уже указывает num_list . Это различие объясняется более подробно здесь.
Если вы действительно хотите выполнить цикл, попробуйте следующее:
Это делает то, что вы хотите:
Ключ состоит в том, что оператор присваивания r = num_list[:] создает копию num_list. Чтобы не путать цикл, мы удаляем элементы из r , а не из списка, который мы перебираем.
Дополнительно: Обработка переменных Python немного тонкая. Python сохраняет имена переменных, например r или num_list , отдельно от переменных данных, например [1, 2, 3, 6, 1] . Имена просто указывают на данные. Рассмотрим оператор присваивания:
После выполнения этого оператора r и num_list оба указывают на одни и те же данные. Если вы вносите изменения в данные r , вы также вносите изменения в данные num_list , потому что они оба указывают на одни и те же данные. Теперь рассмотрим:
Этот оператор сообщает python об изменении данных num_list , используя только некоторые его элементы. Из-за этого python создает копию данных num_list . Так получилось, что [:] указывает, что мы хотим, чтобы все данные num_list остались неизменными, но это не мешает python делать копию. Копия присваивается r . Это означает, что r и mum_list теперь указывают на разные данные. Мы можем вносить изменения в данные r и не влиять на данные num_list , поскольку они имеют разные данные.
Если это вам не знакомо, вам может понадобиться посмотреть на этот урок о подходе python к именам переменных и переменным данным: Понимание переменных Python и управления памятью
Как в питоне убрать минус

В программировании мы всегда взаимодействуем с данными, которые не являются какой-то абстрактной субстанцией. Все данные разделяются по определенному типу. На предыдущих уроках мы узнали, про строки, списки, словари и о логическом типе данных. Сегодня, поговорим о самом базовом типе данных в Python — числах.
Почему нельзя свалить все данные в одну общую кучу и не заморачиваться с каждым типом по отдельности? Допустим, мы присвоили переменной a цифру 5: a = 5. А теперь представьте, что никакого разделения по типу данных нет. Так что находится в переменной: число или строка? Если 10 — это число, то с ним можно произвести математические действия. А если это строка, то мы имеем дело с текстом и тогда Python задействует совсем другие методы.
# объединение строк (конкатенация)
d = '10'
f = 'негритят'
d + ' ' + f
'10 негритят'
Ключевой момент: У каждого типа данных свои методы.
Цифра 100 написанная без кавычек, относится к числовому типу данных. А цифра '100' в кавычках — к строковому типу. С помощью синтаксиса, мы сообщаем Python, какой у нас тип данных. Числа в Python делятся на два вида: целое число и вещественное.
Целое число
К целым числам (int) относятся все положительные и отрицательные числа без дробной части. Все положительные целые числа называются натуральными.
-80, -10, -4, 0, 1, 2, 20
Вещественное число
У вещественных чисел (float) всегда присутствует дробная часть, а ещё их называют числами с плавающей точкой. Поскольку дробная часть отделяется от целой части, точкой.
Математические операции с числами
Ради математических вычислений в Python и существует числовой тип данных.
Сложение чисел
e = 45 + 55
print(e)
100
Вычитание чисел
Умножение чисел
Деление чисел
У результата деления целого числа на целое, всегда будет дробная часть. Такая особенность обусловлена тем, что в большинстве случаев числа не делятся без остатка.
Целочисленное деление
В результате целочисленного деления, всегда будет целое число. Мы просто отбрасываем остаток. Число 15 поместится целых 2 раза.
Остаток от деления
Ответом будет остаток от деления. При обычном делении, ответ был бы 15.1. Но нам нужен только остаток. Убираем целое число и оставляем 1.
n = 16 % 3
print(n)
1
Возведение числа в степень
Число перед двумя звездочками — это объект, который нужно возвести в степень. Цифра после звездочек обозначает, в какую степень возводим: 4 возводим во вторую степень.
l = 4 ** 2
print(l)
16
В Python есть встроенные математические функции.
Модуль числа
Функция abs() находит модуль числа. Передаем в параметрах одно значение. Если передаваемое значение отрицательное, то abs() вернет положительное число. Модуль числа не может быть отрицательным.
Наименьшее число
Функция min() в Python возвращает самое маленькое число.
Максимальное число
Функция max() вернет самое большое число.
Округление до целого числа
Функция round() округляет до целого числа.
Вывести число в Python
Функция print() выводит числа на экран.
Ввести число в Python
Функция input() считывает вводимое значение пользователем в консоль и сохраняет его в переменной. Но что произойдет, если мы введем какое-нибудь число и затем обратимся к переменной?
Python вывел строку, так как число стоит в кавычках.
Для ввода целого числа, следует обернуть функцию input() в другую функцию int().
Для вещественного числа, соответственно в float().
Как посчитать сумму введенных чисел?
В команде input() можно передавать подсказки.
w = int(input(«Введите первое число: «))
q = int(input(«Введите второе число: «))
summa=w+q
print(summa)
Введите первое число: 6
Введите второе число: 7
13

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Она выглядит вот так:
Комментарии ( 0 ):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Вычисления в python
Хорошего дня! Сегодня мы научимся умножать, делить, вычитать. В каком смысле ты это уже умеешь?! А ты в этом уверен? В любом случае, повторение — это мать учения, так что устраивайся по-удобнее, мы начинаем.
Арифметические операции в python
Вы считаете, что арифметические операции — это просто? Пересчитайте. На самом деле, всё не так страшно, но расслабляться не стоит.
Начнём со всем знакомой четверки:
print ( 10 + 10 )
# 10
print ( 10 — 5 )
# 5
print ( 11 * 7 )
# 77
print ( 10 / 2 )
# 5.0
Никаких неожиданностей, правда? Не совсем, посмотрите внимательно на операцию деления. Заметили? Мы разделили целое число на его делитель, но несмотря на это, результат имеет тип float . Взглянем на операцию деления чуть более пристально:
print ( 10 / 2 )
# 5.0
print ( 100 / 3 )
# 33.333333333333336
print ( 21 / 4 )
# 5.25
print ( 23 / 7 )
# 3.2857142857142856
Обратите внимание на деление 100 / 3 . Выполнив эту операцию, мы получили очень интересный результат 33.333333333333336 . На конце 6 ?! Вспомним перевод числа в двоичную систему счисления. То есть мы можем представить любое число в виде ноликов и единичек, например:
37 = 2^5 + 2^2 + 2^0 = 100101 .
А как обстоит дело с дробями? Точно также:
0.75 = 0.5 + 0.25 = 1/2 + 1/4 = 0.11
Возникает вопрос, как перевести в двоичную систему такие дроби: 1/3
1/3 = 1/4 + 1/8 + 1/16 + 1/32 + .
Это может продолжаться бесконечно долго. Поэтому python прерывает выполнение таких вычислений и часто выдает такие приколы:
print ( 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 )
# 0.7999999999999999
print ( 0.1 + 0.2 )
# 0.30000000000000004
print ( 7 / 3 )
# 2.3333333333333335
Еще немного математики. Математика в каждый дом!
# Возведение в степень
print ( 10 * * 2 )
# 100
print ( 2 * * 4 )
# 16
print ( 3 * * 0.5 )
# 1.7320508075688772
print ( 3 * * — 2 )
# 0.1111111111111111
# Остаток от деления
print ( 11 % 4 )
# 3
print ( 101 % 7 )
# 3
print ( 34 % 5 )
# 4
# Деление нацело
print ( 20 // 4 )
# 5
print ( 129 // 11 )
# 11
print ( 100 // 61 )
# 1
Операции сравнения в python
Операции сравнения в отличие от арифметические имеют всего два результата: True и False . Чаще всего такие операции используются в условии циклов, условных оператов, а также в некоторых функциях, например, filter .
# Операция равенства: True, если X равен Y
print ( 10 == 10 )
# True
print ( 666 == 661 )
# False
# Операция неравенства: True, если X не равен Y
print ( 666 != 661 )
# True
print ( 666 != 666 )
# False
# Операция больше: True, если X больше Y
print ( 120 > 2 )
# True
print ( 1000 > 1999 )
# False
# Операция меньше: True, если X меньше Y
print ( 121 120 )
# False
print ( 0 1 )
# True
# Операция меньше или равно: True, если X меньше или равен Y
print ( 6 6 )
# True
print ( 5 2 )
# False
# Операция больше или равно: True, если X больше или равен Y
print ( 1000 >= 10000 )
# False
print ( 9999 >= 9999 )
# False
Логические операции в python
Логические операции, как и операции сравнения, имеют всего два возможных результата: True и False . Используются для объединения операций сравнения в условиях циклов, условных оператов, а также в некоторых функциях, например, filter .
# Оператор «and» или конъюнкция.
# True, если и выражение X, и выражение Y равны True
print ( 10 == 10 and 10 > 2 )
# True
print ( 666 == 661 and 9 > 0 )
# False
# Оператор «or» или дизъюнкция.
# True, если или выражение X, или выражение Y равны True
print ( 666 == 661 or 9 > 0 )
# True
print ( 666 == 661 or 9 0 )
# False
# Оператор «not» или инверсия меняет значение на противоположное.
# True, если выражение X равно False
print ( not 120 > 2 )
# False
print ( not 1000 999 )
# True
print ( not ( 121 121 and 10 == 2 ))
# True
Округление чисел в python
Всё дело в округлении! В python есть несколько замечательных функций, которые округляют число до указанного знака. Одной из таких функций является round :
pi = 3.14159265358979323846264338327
print (round(pi, 1 ))
# 3.1
print (round(pi, 2 ))
# 3.14
print (round(pi, 3 ))
# 3.12
print (round(pi, 4 ))
# 3.1416
print (round(pi, 10 ))
# 3.1415926536
print (round(pi, 15 ))
# 3.141592653589793
Рассмотрим любопытный пример:
print (round( 2.5 ))
# 2
print (round( 3.5 ))
# 4
Если на вашем лице застыл немой вопрос: «почему?», то я вас понимаю. В школе нас учили, что дроби 1.1, 1.2, 1.3, 1.4 округляются до единицы, а 1.5, . 1.9 до двойки. Но python думает по-другому. Есть два типа округления: арифметическое и банковское. Именно арифметическому округлению вас учили в школе. Python использует как раз-таки банковское округление, его еще называют округлением до ближайшего четного. Приведу еще несколько примеров:
print (round( 10.51213 ))
# 11
print (round( 23.5 ))
# 24
print (round( 22.5 ))
# 22
Модуль math
Модуль math представляет собой набор математических формул. Рассмотрим несколько примеров:
# Синус 3.14 радиан
print (math. sin ( 3.14 ))
# 0.0015926529164868282
# Косинус 1.1 радиан
print (math. cos ( 1.1 ))
# 0.4535961214255773
# Возведение экспоненты в 3 степень
print (math. exp ( 3 ))
# 20.085536923187668
# Натуральный логарифм 61
print (math. log ( 61 ))
# 4.110873864173311
# Факториал четырех
print (math. factorial ( 4 ))
# 24
# Извлечение квадратного корня
print (math. sqrt ( 9 ))
# 3.0
# Алгоритм Евклида для чисел 20 и 19
print (math. gcd ( 20 , 19 ))
# 1
# Вычисление гипотенузы треугольника с катетами 3 и 4
print (math. hypot ( 3 , 4 ))
# 5.0
# Перевод радиан в градусы
print (math. degrees ( 1.572 ))
# 90.06896539456541
# Факториал четырех
print (math. fmod ( 20 , 3 ))
# 24
И это далеко не всё! Остальные функции я предлагаю вам протестировать самостоятельно : )
Python с абсолютного нуля. Учимся кодить без скучных книжек

Недавно мы проводили опрос о том, какой курс по Python был бы интереснее читателям. Две первые строчки с большим отрывом в нем заняли варианты «для хакера» и «Python с нуля». Узнав о таком положении дел, мы немедленно заказали статью о том, как начать программировать на Python. Если она будет иметь успех, то может превратиться в целую серию. Отличие нашего подхода — в том, что мы объясняем все живым языком и даем нескучные примеры. В общем, обучение в фирменном стиле «Хакера»!
И, поскольку это эксперимент, статья доступна без платной подписки.
Если у тебя на компе есть современный дистрибутив Linux, то в него уже входит Python 3, а писать первые программы будет удобно в IDLE — простом редакторе кода, который прилагается к Python. В Ubuntu, чтобы установить его, набери в консоли
В Windows при установке Python обязательно отметь на первом экране установщика галочку Add to Path, чтобы можно было запускать python3 из командной строки в любом удобном месте.
Запустив IDLE, зайди в Options → Configure IDLE, перейди на вкладку General и поставь галочку на пункте Open Edit Window, нажми ОK и перезапусти IDLE. Теперь можно писать программы, сохранять их и запускать клавишей F5. Ну что, погнали?
Переменные
В любом языке программирования есть такая штука, как переменные. Это как в школьной алгебре: вот переменная a = 1 , вот переменная b = 2 . То есть это такие абстрактные штуки, внутри них лежит значение, которое может меняться — например, когда ты пишешь после переменной знак равно и какое‑то новое значение.
Ну, то, что print( a) — это команда, которая печатает на экране текущее значение переменной, ты уже понял. Ты написал после знака равно снова саму переменную + 2 , то есть сначала в переменной было значение 2, потом к этому значению прибавили еще 2. На экране гордо красуется 4. Поздравляю, два и два сложили!
А если изначально неизвестно, какие числа надо складывать? Тогда пришлось бы сперва попросить юзера ввести их в консоли и нажать Enter. Давай так и сделаем:
Внутри скобочек у input ты пишешь пояснение для юзера, что конкретно его просят ввести. Но вот беда, по умолчанию все, что вводится через input, считается не числом, а строкой, поэтому, прежде чем складывать количество литров пива, нужно сначала преобразовать введенные строки в числа с помощью функции int().
Слово «функция» должно быть знакомо тебе из математики. В скобках мы пишем то, что она принимает (аргумент), а на выходе будет результат. Python сначала подменит переменную на ее текущее значение ( int( a) на, скажем, int( «5») , а потом функцию — на результат ее выполнения, то есть 5. Бывает, что функция ничего не возвращает, только что‑то делает. Например, print( ) только печатает аргумент.
Окей, преобразовал строки в числа, положил их в переменную c , а дальше‑то что за треш внутри скобок у print ? Тут складываются строки (строки всегда пишутся внутри кавычек), поясняющие, что именно выводится на экран, а результат сложения передается в функцию print( ) .
Чтобы строки безболезненно сложились с переменной c , в которой лежит число, надо преобразовать его в строку функцией str( ) — так же как мы превращали строки в числа, только наоборот.
Вообще, типов переменных много, но суть ты уловил — чтобы производить с переменными какие‑то действия, нужно их сначала привести к одному типу — к строковому, или к числовому, или еще к какому‑нибудь. Если с этим не заморачиваться, Python сложит не числа, а строки и введенные 2 и 3 литра пива в сумме дадут не 5, а целых 23. Хорошо бы так было в реальности!
Вот еще примерчик, рассчитывающий, сколько тебе еще пить пиво, исходя из средней продолжительности жизни в России:
Здесь мы вызываем функцию input( ) , чтобы получить значение, вычитаем его из 73 (средняя продолжительность жизни россиянина), не забыв превратить строку в число, а потом печатаем результат, превратив число обратно в строку и сложив с другими строками.
Итак, ты узнал, что такое целочисленные и строковые переменные, что эти типы можно преобразовывать друг в друга командами int( ) и str( ) . К тому же теперь ты умеешь получать переменные от пользователя с помощью функции input( ‘Введите что-то’) и печатать результаты с помощью функции print( ) .
Условия
В основе любой программы лежат условия. В зависимости от того, выполняются они или не выполняются, программа может пойти по одному или другому пути. Представь, ты едешь на машине и смотришь на часы: если уже есть десять вечера, то поворачиваешь домой, если нет, то можно заехать в гости. Точно так же работает и программа: проверяет какое‑то значение и сворачивает туда или сюда и выполняет соответствующий кусочек кода.
На английском if значит «если», а else — «иначе» или «в противном случае». В строчке после if идет условие, которое мы проверяем. Если оно верно, выполняется первый блок кода (он отделен четырьмя пробелами вначале). Если неверно, то тот, что после else: .
Блоки кода в Python отделаются отступами. Отступ на самом деле может быть любым, например некоторые предпочитают использовать вместо четырех пробелов клавишу Tab. Главное — не смешивать в одной программе отступы разного типа. Если уж начал использовать четыре пробела, то используй по всей программе, а то Python будет на тебя ругаться и унижать.
Еще один важный момент здесь — это знак равенства в условии. Он пишется как двойное «равно» ( == ) и этим отличается от присвоения — одинарного «равно».
Функция lower(), прежде чем сравнивать условие, делает все буквы в строке маленькими, потому что глупый юзер может ввести слово YES с горящим Caps Lock, и это надо предусмотреть заранее.
На самом деле lower( ) — не просто функция, а метод класса string (строка). Именно поэтому он вызывается через точку после переменной, которая содержит строку. О классах и методах мы поговорим как‑нибудь в другой раз, а пока просто запомни, что некоторые функции вызываются таким образом.
Давай попробуем сделать условие для проверки логина и пароля, используя оператор И, который пишется как and . Он нужен для того, чтобы проверить одновременно выполнение первого и второго условия.
Python-сообщество
Нужно убрать минус в числе без использования abs, math или сплайсов в строке и тому подобное.
Вероятно подразумевается использование format в print. Но я что-то не могу найти подходящий оператор.
Может возможно математическое решение?
Какие есть варианты?
#2 Ноя. 19, 2022 16:18:51
убрать минус в числе без использования abs и math
1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде 
2. чтобы вставить изображение залейте его куда нибудь (например) , нажмите
и вставьте ссылку на его url
…
есчщо
Отредактировано AD0DE412 (Ноя. 19, 2022 16:22:44)
#3 Ноя. 19, 2022 17:10:49
убрать минус в числе без использования abs и math
Прошу прощения, вопрос не полный. Дополняю.
На входе два числа, одно из другого вычитается. В результате нужно получить abs(число). Но входящие числа идут в разнобой. Проверить какое из них меньше так же нельзя.
Таким образом число может быть как положительным, так и отрицательным, но результат всегда должен быть положительным.
#4 Ноя. 19, 2022 18:21:06
убрать минус в числе без использования abs и math
1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде 
2. чтобы вставить изображение залейте его куда нибудь (например) , нажмите
и вставьте ссылку на его url
…
есчщо
#5 Ноя. 19, 2022 20:31:04
убрать минус в числе без использования abs и math
#6 Ноя. 19, 2022 20:54:18
убрать минус в числе без использования abs и math
отож оно еще более очивидно
этот момент не понимаю
1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде 
2. чтобы вставить изображение залейте его куда нибудь (например) , нажмите
и вставьте ссылку на его url
…
есчщо
Отредактировано AD0DE412 (Ноя. 19, 2022 21:40:33)
#7 Ноя. 19, 2022 23:27:16
убрать минус в числе без использования abs и math
Это называется кортеж из элементов, из которого берётся элемент по индексу ноль или один.
n < 0 даёт в результате True или False. При этом, как известно, логические True и False являются объектами класса bool, который является подклассом класса int. Поэтому True и False можно использовать везде, где можно использовать целые числа.
Список классов питона можно получить, выполнив help() и далее набрав там слово “builtins”.
Также можно запустить pydoc или pydoc3 с опцией -p, открыть локально в браузере страницу на этом порте и там перейти в раздел builtins.
Python: удаление минусов из списка чисел
После появления remove_negs([1, 2, 3, -3, 6, -1, -3, 1]) выполняется, результат такой: [1, 2, 3, 6, -3, 1] . Предполагается, что результат [1, 2, 3, 6, 3, 1] . происходит то, что если есть два отрицательных числа подряд (например, -1, -3 ), то второе число не будет удалено. def main(): numbers = input(«Введите список чисел: «) remove_negs(numbers)
Звучит как хорошая работа для понимания списка, которое проверяет val >= 0. — Dogweather
Не удаляйте элементы из списка, который вы повторяете, так как это изменяет индекс элементов, и вы можете в конечном итоге пропустить некоторые элементы. — kylieCatt
Как говорили другие, не меняйте содержимое контейнера данных во время его повторения. Перебрать копию — для элемента в списке (num_list): — macfij
Также не стоит звонить remove чтобы удалить элемент, когда вы уже знаете, где он находится. Это (а) потенциально неправильно, потому что remove удаляет первый элемент, равный item , который может быть не тем, который вам нужен, и (б) медленным, потому что это означает, что вам придется искать элемент по всему списку, даже если вы уже знаете, где он находится. del num_list[index] всегда лучше. Но как узнать индекс? Простой: for index, item in enumerate(num_list): . (Это все примечание; это не решит вашу настоящую проблему… но для этого уже есть хорошие ответы и комментарии.) — abarnert
8 ответы
Обычно плохой идеей является удаление элементов из списка во время его повторения (см. связь в моем комментарии для объяснения, почему это так). Лучшим подходом было бы использование понимание списка:
Обратите внимание, что строка выше создает new список и назначает num_list к тому, что. Вы также можете выполнить «на месте» назначение формы
который не создает новый список в памяти, а вместо этого изменяет ячейку памяти, на которую уже указывает num_list . Эта разница объясняется более подробно здесь.
ответ дан 23 мая ’17, 11:05

Я не думаю, что ОП действительно нужно мутировать num_list здесь, поэтому исходная версия (без назначения слайса), вероятно, была в порядке. Может быть, было бы даже лучше показать оба и объяснить разницу? — Abarnert
@abarnert Да, возможно, ты прав. Я отредактирую, чтобы объяснить разницу. — аршаджи
@ user3161743: Вы сказали: «Результат должен быть [1, 2, 3, 6, 3, 1] . Это именно то, что выдает код arshajii. Если вы сделаете это так, как утверждаете, то результатом будет [1, 2, 3, 3, 6, 1, 3, 1] . — Abarnert
Если вы действительно хотите зациклиться, попробуйте следующее:
Это делает то, что вы хотите:
Суть в том, что оператор присваивания r = num_list[:] делает копию num_list. Чтобы не путать цикл, мы удаляем элементы из r а не из списка, который мы перебираем.
Подробнее: Обработка переменных в Python немного тонкая. Python сохраняет имена переменных, например r or num_list отдельно от переменных данных, таких как [1, 2, 3, 6, 1] . Имена являются просто указателями на данные. Рассмотрим оператор присваивания:
После выполнения этого оператора r и num_list оба указывают на одни и те же данные. Если вы вносите изменения в r данные, вы также вносите изменения в num_list , потому что они оба указывают на то же данные. Теперь рассмотрим:
Этот оператор говорит python изменить num_list данные, взяв только некоторые его элементы. Из-за этого python делает копию num_list данные. Так уж случилось, что [:] указывает, что мы хотим, чтобы все num_list данные не изменились, но это не мешает python делать копии. Копия назначена r . Это значит, что r и mum_list теперь укажите на различный данные. Мы можем внести изменения в r данные, и это не влияет num_list данные, потому что у них есть различный поле.
Если это новое для вас, вы можете посмотреть этот учебник о подходе Python к именам переменных и переменным данным: Понимание переменных Python и управления памятью