Изменение глобальной переменной через функцию в Python 3

недавно начал изучать Python 3 и столкнулся с такой проблемой: я не могу изменить глобальную переменную через функцию, использовав переменную в виде аргумента, подскажите, пожалуйста, возможно ли вообще такое сделать?

name = "Tom"

def set_name (before, after):
  before = after

set_name (name, "John")

Что-то на подобие такого, но имя всё равно остаётся "Том"


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

Автор решения: Alpensin

Для работы с глобальной переменной:

def set_name(after):
    global name
    name = after
set_name("John")

Но так делать нехорошо - работать напрямую с глобальными переменными. Лучше так, но это бессмысленно, т.к. можно переопределить переменную без функции. Даю для учебных целей.

def set_name(after):
    return after
name = set_name("John")

Может ваш пример неудачный? Почему не катит просто

name = "Tom" # Изначально присвоили Том.
name = "John" # Поменяли на Джон.

Функции стоит применять, если мы делаем какие-то операции с данными внутри неё. А в данном случае идёт просто присваивание.

→ Ссылка
Автор решения: Кирилл Малышев

Строки в python неизменяемы. Такое можно сделать только с изменяемым объектом.

Например так:

def set_name(before, after):
  before.val = after

class A:
    def __init__(self, val):
        self.val = val

name = A("Tom")
set_name(name, "John")

Или просто со списком из одного элемента:

def set_name(before, after):
  before[0] = after

name = ["Tom"]
set_name(name, "John")
→ Ссылка