Задать вопрос
@DMITRY1234455

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

У меня такая проблема. Я сделал класс и там сделал функцию, где я привел одну переменную в качестве аргумента. Вот код(возможно понятнее там будет)

class Work:
    def __init__(self):
        pass
    def Check(self, value1, not_real_name, value2, real_name):
        if value1 == not_real_name:
            value2 = real_name

checkFile = Work()

one = input("> ")

with open("data/myfile", encoding="utf-8") as NameFile:
    Cut = NameFile.read().split(';')
    EtaPeremennaya = ""
    checkFile(one,  "Dima", EtaPeremennaya, "Dmitry")


этот код я привел для примера, мне просто надо узнать почему в переменную "EtaPeremennaya" не записалось значение(я только недавно начал учить Python) смотрел в гугле - ничего не нашел
  • Вопрос задан
  • 89 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
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
Программист, энтузиаст
И не должно. начните, действительно с учебника, а не сгугла, потому что это основы и самая база. Если вы это не прочитали в учебнике, то вам в питоне больше елать нечего. Просто займитесь чем-то другим. Нагуглить это вы не сможете.
Это как спрашивать как на калькуляторе установить рингтон.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы