将python变量从object传递给parent

时间:2011-03-22 21:41:32

标签: python variables

我正在编写一个python程序,希望跟踪来自几个不同位置的状态标志。我做了一些阅读,发现传递给函数的Python变量不一定能被该函数修改(在我的情况下它不能)。举个例子:

def testfunc(self, inVariable):
  inVariable = 4

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

在这种情况下,输出将是: 6 6

并且永远不会将4分配给myVariable。

意识到这无法改变,有没有人为这种情况有一个好的解决方法?全局变量,也许?

我正在处理的情况要比这个复杂得多,所以回复一个值并分配它对我来说不是一个简单的选择。

谢谢!

马龙

3 个答案:

答案 0 :(得分:1)

  

全球变量,也许?

全局变量几乎总是一个坏主意。

Python中的变量只是将名称绑定到值,在testFunc中,您所做的只是更改绑定到inVariable的值,而不是更改变量本身。

您需要将对象传递给您的函数并修改其属性。您使用内置类型,例如listdict,但创建自己的类同样容易:

>>> 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

答案 1 :(得分:1)

三种解决方案:

  • 传递包含数据的集合对象

    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作为参数传递)。如果status标志是类变量或实例变量,则该方法可以将其更改为self.status = 4,并且将保留此更改。

答案 2 :(得分:1)

感谢大家的好主意。我最终“欺骗”了这个:该程序是用Qt编写的,所以我能够使用信号和插槽来实现我的目标。

使用类变量是一个有趣的想法;它有点欺骗python创建一个可变的变量,对吗?我认为,如果不是我的替代解决方案,全局变量可能是一个很好的方法;这似乎是罕见的情况之一,他们可能是一个好主意。

希望这些答案能够帮助其他有类似问题的人。

干杯

马龙