Module (44%)
Section (80%)

Как функция взаимодействует со своими аргументами

Теперь давайте выясним, как функция взаимодействует со своими аргументами.

Код в редакторе должен Вас чему-то научить. Как видите, функция меняет значение своего параметра. Влияет ли это изменение на аргумент?

Запустите программу и проверьте.

Код выведет:

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


Вы можете это объяснить?

Давайте попробуем:

  • если аргумент является списком, то изменение значения соответствующего параметра не влияет на список (помните: переменные, содержащие списки, хранятся иначе, чем скаляры)
  • но если вы измените список, идентифицированный параметром (обратите внимание: список, а не параметр!), изменение отобразится на списке.

Пришло время написать несколько примеров функций. Вы сделаете это в следующем разделе.


Code

def my_function(n):
print("I got", n)
n += 1
print("I have", n)


var = 1
my_function(var)
print(var)
{{ dockerServerErrorMsg }} ×
{{ errorMsg }} ×
{{ successMsg }} ×