Создание функции:
def disk_area(radius):
return 3.14 * radius * radius
disk_area(1.5)
7.0649999999999995
Значения по умолчанию оцениваются при определении функции, а не при ее вызове. Это может быть проблематично при использовании изменяемых типов (например, словаря или списка) и изменении их в теле функции, поскольку изменения будут постоянными при вызовах функции.
Использование неизменяемого типа в аргументе ключевого слова:
bigx = 10
def double_it(x=bigx):
return x * 2
bigx = 1e9 # Now really big
double_it()
20
Используя изменяемый тип в аргументе ключевого слова (и изменяя его внутри тела функции):
def add_to_dict(args={'a': 1, 'b': 2}):
for i in args.keys():
args[i] += 1
print(args)
add_to_dict
<function __main__.add_to_dict(args={'a': 1, 'b': 2})>
add_to_dict()
{'a': 2, 'b': 3}
add_to_dict()
{'a': 3, 'b': 4}
add_to_dict()
{'a': 4, 'b': 5}
Можете ли вы изменить значение переменной внутри функции? Большинство языков (C, Java,…) различают «передача по значению» и «передача по ссылке».
В Python такое различие несколько искусственно, и немного неясно, будут ли изменены ваши переменные или нет. К счастью, существуют четкие правила.
Параметры функций - это ссылки на объекты, которые передаются по значению. Когда вы передаете переменную в функцию, Python передает ссылку на объект, на который ссылается переменная (значение). Не сама переменная.
Если значение, переданное в функцию, является неизменным, функция не изменяет переменную вызывающей стороны. Если значение является изменяемым, функция может изменить переменную вызывающего на месте:
def try_to_modify(x, y, z):
x = 23
y.append(42)
z = [99] # new reference
print(x)
print(y)
print(z)
a = 77 # immutable variable
b = [99] # mutable variable
c = [28]
try_to_modify(a, b, c)
print(a)
print(b)
print(c)
23 [99, 42] [99] 77 [99, 42] [28]