Почему не работает переменная которая прошла через функцию?
И не должно. начните, действительно с учебника, а не сгугла, потому что это основы и самая база. Если вы это не прочитали в учебнике, то вам в питоне больше елать нечего. Просто займитесь чем-то другим. Нагуглить это вы не сможете.
Это как спрашивать как на калькуляторе установить рингтон.
Потому что переменная не "прошла через функцию". 
Одна переменная 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])

По-идее, класс должен содержать в себе экземпляры и методы для изменения этих экземпляров, а снаружи ничего менять ему не надо. Если меняет - плохо, не тем занимается. В принципе, бывают случаи, когда делают классы - "швейцарские ножи", складывая в них всякие функции, относящиеся к одной теме... но это как-то мне кажется не этот случай.