2014-10-03 112 views
2

我寫了一個簡單的函數來計算模式,但似乎有一個參數沒有成功通過。爲什麼我不能通過我的參數python

我初始countdict= dict()在主要功能,然後我通過它mod = mode(magList, countdict)

mode(alist, countdict),countdict= dict(zip(alist,[0]*len(alist)))。和countdict可以在模式下打印。

但是當我在主函數中嘗試print(countdict)時,輸出表示它是空的。我檢查我的代碼,它在功能模式中說,我沒有使用countdict。這怎麼可能。

整個代碼如下:

def mode(alist, countdict): 
    countdict= dict(zip(alist,[0]*len(alist))) 
    for x in alist: 
     countdict[x]+=1 
    maxcount =max(countdict.values()) 
    modelist = [ ]  
    for item in countdict: 
     if countdict[item] == maxcount: 
      modelist.append(item) 
    return modelist 



def makeMagnitudeList(): 
     quakefile = open("earthquakes.txt","r") 
     headers = quakefile.readline() 

     maglist = [ ] 
     for aline in quakefile: 
      vlist = aline.split() 
      maglist.append(float(vlist[1])) 
     return maglist 

def mymain(): 
    magList = makeMagnitudeList() 
    print(magList) 
    countdict= dict() 
    mod = mode(magList, countdict) 
    print("mode: ", mod) 
    print(countdict) 

if __name__=='__main__': 
    mymain() 
+0

我懷疑這是因爲'countdict'在'mode'函數的第一行被重新分配。 – 2014-10-03 07:39:50

+2

您正在誤解有關全局和局部變量的一些概念。你在main中的'countdict'與函數中的'countdict'不一樣,它們是完全不同的變量。也許這會幫助你[Python通過引用傳遞變量](http://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-reference) – AlvaroAV 2014-10-03 07:42:23

回答

0

正如我剛纔所說,該行:

countdict= dict(zip(alist,[0]*len(alist))) 

會消滅你傳遞的參考countdict正因爲如此,在countdict變量要打印的是原始的,空的字典。 Liarez鏈接到的問題:How do I pass a variable by reference?將有助於解釋爲什麼會發生這種情況。

要解決這個問題,你可以在mode功能改變return語句:

return (modelist, countdict) 

將返回含有modelistcountdict的元組。當調用這個函數,你可以這樣寫:

(mod, countdict) = mode(magList, countdict) 

確保修改後的countdict返回,也就是說你的print函數調用不應該輸出一個空的字典。

另外要注意的是,countdict要傳遞到mode是空的,所以你可能會發現它更好地根本就沒有經過這一觀點,並有mode只需要一個參數。

0

這行代碼是你的問題。

countdict= dict(zip(alist,[0]*len(alist))) 

Python字典是可變對象,可以在函數中進行更改,但字典本身不會傳遞給函數。只傳遞參考並按值傳遞。這意味着當您爲countdict參數指定一個新字典時,將丟失在mymain函數中創建的原始參考countdict

相關問題