将Python变量从对象传递给父对象
我正在写一个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
绑定的值,而不是改变这个变量本身。
你需要把一个对象传给你的函数,然后修改它的属性。你可以使用像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