Передать переменную python от объекта к родителю - PullRequest
1 голос
/ 23 марта 2011

Я пишу программу на Python, которая хочет отслеживать флаг статуса из нескольких разных мест. Я прочитал, что переменная Python, передаваемая в функцию, не обязательно может быть изменена этой функцией (в моем случае это невозможно). Как пример:

def testfunc(self, inVariable):
  inVariable = 4

def main():
  myVariable = 6
  print myVariable
  testfunc(myVariable)
  print myVariable

В этой ситуации вывод будет: 6 6

и 4 никогда не будет присвоено myVariable.

Понимая, что это нельзя изменить, есть ли у кого-нибудь хороший обходной путь для этой ситуации? Глобальные переменные, возможно?

Ситуация, с которой я сталкиваюсь, намного сложнее, чем эта, поэтому что-то вроде возврата значения и присвоения его не является легким вариантом для меня.

Спасибо!

Marlon

Ответы [ 3 ]

1 голос
/ 23 марта 2011

Три решения:

  • передать ему объект коллекции, содержащий ваши данные

    def testFunc1(var):
        var[0] = 4
    
    myvar = [6]
    testFunc1(myvar)
    print(myvar[0])
    
  • сделать переменную глобальной

    myvar = None
    def testFunc2():
        global myvar
        myvar = 4
    
    myvar = 6
    testFunc2()
    print(myvar)
    

    Обычно я не люблю глобальные переменные, но в зависимости от того, что вы делаете, это может иметь смысл.

  • возвращает переменную из функции

    def testFunc3(var):
        return 4
    
    myvar = 6
    myvar = testFunc3(myvar)
    print(myvar)
    

Редактировать: четвертый вариант;согласно вашему объявлению,

def testfunc(self, inVariable):

это, кажется, метод класса (передавая self в качестве аргумента).Если флаг состояния является переменной класса или переменной экземпляра, метод может изменить его на self.status = 4, и это изменение будет сохранено.

1 голос
/ 24 марта 2011

Спасибо всем за хорошие идеи. В итоге я «обманул» эту программу: программа написана на Qt, поэтому я мог использовать сигналы и слоты для достижения своей цели.

Использование переменных класса - интересная идея; это своего рода хитрости Python в создании переменной, которая изменчива, правильно? Я думаю, что глобальные переменные могли бы быть хорошим способом, если бы не мое альтернативное решение; это похоже на один из редких случаев, когда они могли бы быть хорошей идеей.

Надеюсь, эти ответы помогут и другим с подобными проблемами.

Приветствия

Marlon

1 голос
/ 23 марта 2011

Возможно, глобальные переменные?

Глобальные переменные почти всегда плохая идея.

Переменная в Python просто привязывает имя к значению, в testFunc все, что вы делаете, это изменяете значение, привязанное к inVariable, а не изменяете саму переменную.

Вам нужно будет передать объект в вашу функцию и изменить ее атрибуты.Вы используете встроенный тип, например list или dict, но создать собственный класс так же просто:

>>> class Status(object):
...     # Lazily use a class variable as a default for instance variables
...     flag = 0
...
>>> def testFunc(status):
...     status.flag = 4
...
>>> s = Status()
>>> s.flag = 6
>>> s.flag
6
>>> testFunc(s)
>>> s.flag
4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...