我在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
的结果传回原始函数以供使用?
答案 0 :(得分:1)
正如jonrsharpe在评论中建议的那样,只需要影响变量的返回值:
pingchk = pinger(pcName, pingchk)
这里只有两个警告:
你有一个不会返回任何内容的分支(当你打印可用时),所以你会得到一个可能不符合你预期的None:在这种情况下一直返回0或更好地将退货移出if:
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)
答案 1 :(得分:0)
要修改函数内的变量,请将它们作为列表传递。
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
答案 2 :(得分:0)
当你在python中调用一个函数时,它会返回一个变量,就像你正在进行基本的数学运算一样。例如,如果你这样做:
3*2
您的shell将返回6,但不保存此结果。如果你想保存它,只需:
x = 3*2
您的功能pinger
也是如此,当您从someFunction
拨打电话时,您必须这样做:
pingchk = pinger(pcName, pingchk)
因为pingchk
是一个局部变量。
关于您的代码的另一个评论:在someFunction
中,您首先使用pinger
作为参数调用pingchk
,但事先不存在,因此,您的代码将无法转换。< / p>
答案 3 :(得分:0)
两种方式:
我最喜欢的,把你的变量放在另一个模块中并导入它。 例如
来自commonstuff import pingcheck的