我正在编写一个python程序,希望跟踪来自几个不同位置的状态标志。我做了一些阅读,发现传递给函数的Python变量不一定能被该函数修改(在我的情况下它不能)。举个例子:
def testfunc(self, inVariable):
inVariable = 4
def main():
myVariable = 6
print myVariable
testfunc(myVariable)
print myVariable
在这种情况下,输出将是: 6 6
并且永远不会将4分配给myVariable。
意识到这无法改变,有没有人为这种情况有一个好的解决方法?全局变量,也许?
我正在处理的情况要比这个复杂得多,所以回复一个值并分配它对我来说不是一个简单的选择。
谢谢!
马龙
答案 0 :(得分: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
答案 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创建一个可变的变量,对吗?我认为,如果不是我的替代解决方案,全局变量可能是一个很好的方法;这似乎是罕见的情况之一,他们可能是一个好主意。
希望这些答案能够帮助其他有类似问题的人。
干杯
马龙