Задать вопрос
@zlodiak

Почему меняется аргумент функции?

Первый пример:
def func(arr):
    print(arr)
    arr.append(1)

arr_ = [0,0,0]
print('arr_', arr_)
func(arr_)
print('arr_', arr_)


видно, что аргумент в итоге изменяется:
arr_ [0, 0, 0]
[0, 0, 0]
arr_ [0, 0, 0, 1]


Второй пример:
def func(arr):
    print(arr)
    arr = 1

arr_ = 0
print('arr_', arr_)
func(arr_)
print('arr_', arr_)


видно, что аргумент в итоге не меняется:
arr_ 0
0
arr_ 0


Скажите пожалуйста, это явление возможно как-нибудь логически объяснить или нужно просто запомнить, что изменяемые типы можно таким образом изменить, а неизменяемые - нет?
  • Вопрос задан
  • 116 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Смысл в том, что когда ты в первом случае передаёшь список в функцию, ты передаёшь ссылку на него, и функция изменяет массив с помощью его методов. А когда ты, к примеру, передаёшь число, передаётся именно число, а не ссылка на число и поэтому число ты меняешь только внутри функции.
P. S. Если хочешь, чтобы "аргумент" не менялся, то делай новый массив из старого:
def func(arr):
    arr = arr[:]
    print(arr)
    arr.append(1)

arr_ = [0,0,0]
print('arr_', arr_)
func(arr_)
print('arr_', arr_)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@lega
Metalofon NT
А когда ты, к примеру, передаёшь число, передаётся именно число, а не ссылка на число

Питон всегда передает ссылку, просто в первом примере вы не меняете ссылку в переменной arr.append(1) - а меняете содержимое объекта по ссылке (в питоне считается все - есть объект), в во втором примере вы как раз заменяете ссылку в переменной arr = 1, т.е. переменная arr будет уже ссылаться на другой объект (хотя есть некое исключение с кешированием но не в этом случае).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы