将变量从一个函数传递到另一个函数

时间:2016-06-10 13:11:36

标签: python windows python-2.7

我在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的结果传回原始函数以供使用?

4 个答案:

答案 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)

两种方式:

  1. 使用全局变量 - Google会为您提供大量信息和示例
  2. 我最喜欢的,把你的变量放在另一个模块中并导入它。 例如

    来自commonstuff import pingcheck的