2016-06-10 314 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

如何把它放在不同的模塊幫助? –

相關問題