Потому что переменная
не "прошла через функцию".
Одна переменная
value2
ссылается на другую переменную, объявленную в
global
, а другую
value2
вы объявляете в своем методе путем явного присвоения:
value2 = real_name
До объявления
value2
ссылалось на объект из
global
, но после объявления внутри метода стало ссылаться на другой объект, и стало отдельным от глобального.
Пример, поясняющий id объектовclass Demo:
def __init__(self):
pass
def check(self, value1, not_real, value2, real):
print(f'\t{value2} тут еще не объявили {id(value2)}, ссылается на глобальную')
if value1 == not_real:
value2 = real
print(f'\t{value2} тут уже объявили {id(value2)}, ссылается на real {id(real)}')
my_var = 2
print(f'{my_var} тут глобальная {id(my_var)}')
my_test = Demo()
my_test.check(1, 1, my_var, 3)
print(f'{my_var} тут глобальная {id(my_var)}')
У вас есть два относительно простых выхода:
возвращать значение из метода через
return
костыль, т.к. получается, что это не метод, а просто функцияclass Demo:
def __init__(self):
pass
def check(self, value1, not_real, real):
if value1 == not_real:
return real
my_var = 2
print(my_var)
my_test = Demo()
my_var = my_test.check(1, 1, 3)
print(my_var)
передавать в функцию список и менять элемент списка
чудовищный костыль, так лучше не делать, т.к. класс меняет что-то вне класса, да еще изменение списка какое-то неявное, можно забыть или не уследитьclass Demo:
def __init__(self):
pass
def check(self, value1, not_real, value2, real):
if value1 == not_real:
value2[0] = real
my_var = [2]
print(my_var[0])
my_test = Demo()
my_test.check(1, 1, my_var, 3)
print(my_var[0])
По-идее, класс должен содержать в себе экземпляры и методы для изменения этих экземпляров, а снаружи ничего менять ему не надо. Если меняет - плохо, не тем занимается. В принципе, бывают случаи, когда делают классы - "швейцарские ножи", складывая в них всякие функции, относящиеся к одной теме... но это как-то мне кажется не этот случай.