• Почему не работает переменная которая прошла через функцию?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Потому что переменная не "прошла через функцию".
    Одна переменная 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])


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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    И не должно. начните, действительно с учебника, а не сгугла, потому что это основы и самая база. Если вы это не прочитали в учебнике, то вам в питоне больше елать нечего. Просто займитесь чем-то другим. Нагуглить это вы не сможете.
    Это как спрашивать как на калькуляторе установить рингтон.
    Ответ написан
    Комментировать
  • Как сделать получение ID в AIOGRAM?

    KPoseidon
    @KPoseidon
    Шарпист с косяками
    официально в тг бот апи нельзя по юзернейму получать айди пользователя, только если в бд записан и юзернейм и айди данного пользователя
    Ответ написан
    4 комментария