Можно ли в python изменить переменную переданную в аргементе функции

Напрмер есть код

def func(a:str):
    a = "anton"
    return

a = "victor"
func(a)
print(a)

Вывод будет victor но можно как-то изменить переменную в функции?


Ответы (1 шт):

Автор решения: 0dminnimda

Почему значение 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 - глобалья, т.к. объявлена в контексте программы (модуля, или же без отступа)

→ Ссылка