将Python变量从对象传递给父对象

1 投票
3 回答
540 浏览
提问于 2025-04-16 14:13

我正在写一个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

谢谢大家提供的好主意。我最后“作弊”了一下:这个程序是用Qt写的,所以我能用信号和槽来实现我的目标。

使用类变量是个有趣的主意;这有点像是在让Python创建一个可以改变的变量,对吧?我觉得如果没有我的替代方案,使用全局变量可能也是个不错的选择;这似乎是少数几个全局变量可能有用的情况之一。

希望这些回答能帮助到其他遇到类似问题的人。

干杯

Marlon

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作为参数)。如果状态标志是一个类变量或实例变量,这个方法可以像self.status = 4这样修改它,并且这个修改会被保留。

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

撰写回答