将变量从一个函数传递到另一个函数
我在Python中遇到的一件事是将信息从一个函数传递到另一个函数,然后将其更改并传递回原始函数以便有用。看看这个非常基本的例子,试图创建一个可以被各种其他函数调用的ping函数。将变量从一个函数传递到另一个函数
import subprocess
pingchk = 0
def pinger(pcName, pingchk):
ping_out = subprocess.Popen(["ping", "-n", "1", pcName],stdout = subprocess.PIPE).communicate()[0]
if ('unreachable' in ping_out):
print "Warning", "PC not responding 1."
pingchk += 1
return pingchk
elif ('Request timed out.' in ping_out):
print "Warning", "PC not responding 2."
pingchk += 1
print pingchk
return pingchk
elif ('Ping request could not find host' in ping_out):
print "Warning", "PC not responding 3."
pingchk += 2
print pingchk
return pingchk
else:
print "Machine available!"
def someFunction():
pcName = raw_input("Please enter a pc name: ")
pinger(pcName, pingchk)
print pingchk
if pingchk == 1:
print "machine not switched on."
elif pingchk == 2:
print "machine name not recognized."
else:
print "success - machine on."
someFunction()
这是我在努力的pingchk
位。在这个例子中someFunction
正在通过machineName
到pinger
做这项工作,然后我想pinger
把结果传回someFunction
去使用。但是,someFunction
从不重新读取变量pingchk
,因此始终将其读取为0
。
我需要更改哪些内容才能将pinger
的结果回传给原始函数以供使用?
由于jonrsharpe在评论提议去的方法是简单地返回值影响的变量:
pingchk = pinger(pcName, pingchk)
这里有只有2个注意事项:
-
你有一个分支不会返回任何东西(当你打印可用),所以您将看到一个空结束这可能不是你所期望的:在这种情况下始终返回0或更好的移动回出来的,如果:
def pinger(pcName, pingchk): ping_out = subprocess.Popen(["ping", "-n", "1", pcName],stdout = subprocess.PIPE).communicate()[0] if ('unreachable' in ping_out): print "Warning", "PC not responding 1." pingchk += 1 elif ... else: print "Machine available!" return pingcheck
-
你影响变量
pingcheck
somefunction
之前已经被使用过,Python认为它是一个隐藏全局的局部变量。您必须声明它为全局 - 如果你真的需要它是全球性的:def someFunction(): global pingchk pcName = raw_input("Please enter a pc name: ") pingchk = pinger(pcName, pingchk)
但是,如果你有pingcheck没有真正的理由是全球性的,就让它是本地:
def someFunction():
pcName = raw_input("Please enter a pc name: ")
pingchk = pinger(pcName, 0)
太棒了。只需要添加“pingchk = pinger(pcName,0)”即可。在函数内部而不是外部创建变量。非常感谢!克里斯。 – user3514446
要修改函数内部的变量,请将它们作为列表传递。
def ping(counter):
counter[0] += 1 # lists are passed by reference, hence they can be changed in place
mycounter = [0]
ping(mycounter)
print mycounter[0] # this will print 1
ping(mycounter)
print mycounter[0] # this will print 2
不要使用核武器杀死苍蝇...... OP的代码已经返回(几乎总是......)新的价值。 jonrsharpe的建议是去这里的方法 –
当你在python中调用一个函数时,它就像你正在做一个基本的数学运算一样返回一个变量。例如,如果你这样做:
3*2
你的shell将返回6,但不保存这个结果。如果你想保存它,只是做:
x = 3*2
这同样适用于你的函数pinger
,当你从someFunction
调用它,你要做的:
pingchk = pinger(pcName, pingchk)
由于pingchk
否则是本地变量。
对您的代码的另一种说法是:在someFunction
中,您首先调用pinger
并将pingchk
作为参数,但它并不事先存在,因此您的代码不会转向。
两种方式:
- 使用全局变量 - 谷歌会给你足够的信息和示例
-
我最喜欢的,把你的变量在另一个模块并将其导入。 例如
从commonstuff进口pingcheck
如何把它放在不同的模块帮助? –
'pingchk = pinger(pcName,pinkchk)'? – jonrsharpe
@jonrsharpe - 谢谢你的回复,但如果我尝试它声称它在被赋值之前被引用... – user3514446
@jonrsharpe也许你错过了它,但是'pinger(pcName,'**'pinkchk)'**使用该值的全局变量,通过引入赋值,使其成为局部变量,它在分配之前是引用(作为pinger的参数)。 –