Как функция взаимодействует со своими аргументами
Теперь давайте выясним, как функция взаимодействует со своими аргументами.
Код в редакторе должен Вас чему-то научить. Как видите, функция меняет значение своего параметра. Влияет ли это изменение на аргумент?
Запустите программу и проверьте.
Код выведет:
I got 1
I have 2
1
output
Вывод очевиден - изменение значения параметра не распространяется за пределы функции (во всяком случае, если переменная является скаляром, как в примере).
Это также означает, что функция получает значение аргумента, а не сам аргумент. Это верно для скаляров.
Стоит ли проверять, как это работает со списками (помните особенности срезов списков и присвоения списков целиком?).
Следующий пример проливает свет на проблему:
def my_function(my_list_1):
print("Print #1:", my_list_1)
print("Print #2:", my_list_2)
my_list_1 = [0, 1]
print("Print #3:", my_list_1)
print("Print #4:", my_list_2)
my_list_2 = [2, 3]
my_function(my_list_2)
print("Print #5:", my_list_2)
Код выведет:
Print #1: [2, 3]
Print #2: [2, 3]
Print #3: [0, 1]
Print #4: [2, 3]
Print #5: [2, 3]
output
Кажется, что прежнее правило все еще работает.
Наконец, видите ли Вы разницу в приведенном ниже примере:
def my_function(my_list_1):
print("Print #1:", my_list_1)
print("Print #2:", my_list_2)
del my_list_1[0] # Pay attention to this line.
print("Print #3:", my_list_1)
print("Print #4:", my_list_2)
my_list_2 = [2, 3]
my_function(my_list_2)
print("Print #5:", my_list_2)
Мы не меняем значение параметра my_list_1
(мы уже знаем, что это не повлияет на аргумент), а вместо этого изменяем идентифицированный им список.
Результат может быть неожиданным. Запустите код и проверьте:
Print #1: [2, 3]
Print #2: [2, 3]
Print #3: [3]
Print #4: [3]
Print #5: [3]
output
Вы можете это объяснить?
Давайте попробуем:
- если аргумент является списком, то изменение значения соответствующего параметра не влияет на список (помните: переменные, содержащие списки, хранятся иначе, чем скаляры)
- но если вы измените список, идентифицированный параметром (обратите внимание: список, а не параметр!), изменение отобразится на списке.
Пришло время написать несколько примеров функций. Вы сделаете это в следующем разделе.