2016-06-10 281 views
0

我在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正在通过machineNamepinger做这项工作,然后我想pinger把结果传回someFunction去使用。但是,someFunction从不重新读取变量pingchk,因此始终将其读取为0

我需要更改哪些内容才能将pinger的结果回传给原始函数以供使用?

+7

'pingchk = pinger(pcName,pinkchk)'? – jonrsharpe

+0

@jonrsharpe - 谢谢你的回复,但如果我尝试它声称它在被赋值之前被引用... – user3514446

+0

@jonrsharpe也许你错过了它,但是'pinger(pcName,'**'pinkchk)'**使用该值的全局变量,通过引入赋值,使其成为局部变量,它在分配之前是引用(作为pinger的参数)。 –

回答

1

由于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 
    
  • 你影响变量pingchecksomefunction之前已经被使用过,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) 
+0

太棒了。只需要添加“pingchk = pinger(pcName,0)”即可。在函数内部而不是外部创建变量。非常感谢!克里斯。 – user3514446

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 
+0

不要使用核武器杀死苍蝇...... OP的代码已经返回(几乎总是......)新的价值。 jonrsharpe的建议是去这里的方法 –

0

当你在python中调用一个函数时,它就像你正在做一个基本的数学运算一样返回一个变量。例如,如果你这样做:

3*2 

你的shell将返回6,但不保存这个结果。如果你想保存它,只是做:

x = 3*2 

这同样适用于你的函数pinger,当你从someFunction调用它,你要做的:

pingchk = pinger(pcName, pingchk) 

由于pingchk否则是本地变量。

对您的代码的另一种说法是:在someFunction中,您首先调用pinger并将pingchk作为参数,但它并不事先存在,因此您的代码不会转向。

0

两种方式:

  1. 使用全局变量 - 谷歌会给你足够的信息和示例
  2. 我最喜欢的,把你的变量在另一个模块并将其导入。 例如

    从commonstuff进口pingcheck

+0

如何把它放在不同的模块帮助? –

相关问题