Можно ли в python изменить переменную переданную в аргементе функции
Напрмер есть код
def func(a:str):
a = "anton"
return
a = "victor"
func(a)
print(a)
Вывод будет victor но можно как-то изменить переменную в функции?
Ответы (1 шт):
Почему значение a не меняется?
Т.к. a - строка, то в функцию передаётся копия значения a, а не указатель на неё, соответственно, когда мы меняем значение a в функции, мы меняем значение локальной копии, а не глобальной переменной.
Смотрите:
def func(a):
a = "anton"
print("внутри функции", id(a))
a = "victor"
print("вне функции", id(a))
func(a)
print("вне функции", id(a))
print(a)
Выведет что-то типо
вне функции 485256706736
внутри функции 485257302960
вне функции 485256706736
victor
id показывает место в памяти, где лежит значение переменной и, как видите, вне функции оно одно, а внутри - другое.
Как можно обойти?
В вашем случае вы можете использовать ключевое слово global, чтобы получить и изменить значение глобальной переменной:
def func():
global a
a = "anton"
print("внутри функции", id(a))
a = "victor"
print("вне функции", id(a))
func()
print("вне функции", id(a))
print(a)
Выведет что-то на подобии:
вне функции 542195432176
внутри функции 542200565424
вне функции 542200565424
anton
Как лучше реализовать?
Метод с использованием global - наверняка не лучший способ достичь результата, который вы хотите, и я бы посчитал бы это code smell-ом, потому я предлагаю вам сделать так:
def func(a):
a = "anton"
print("внутри функции", id(a))
return a
a = "victor"
print("вне функции", id(a))
a = func(a)
print("вне функции", id(a))
print(a)
Выведет что-то такое:
вне функции 486729169712
внутри функции 486730096368
вне функции 486730096368
anton
Этот подход намного лучше первого.
FAQ
Что за локальные и глобальные переменные?
Локальные переменные - те, которые "заперты" в каком-то контексте, например:
def func(arg):
pass
Здесь arg - локальная переменная, она существует только в контексте функции func, и имеет влияние только на этот контекст.
Глобальные переменные - те, котоые мы объявляем в контексте программы:
foo = 5
Переменная foo - глобалья, т.к. объявлена в контексте программы (модуля, или же без отступа)