为什么我不能传递我的参数python

时间:2014-10-03 07:34:15

标签: python parameters

我写了一个简单的函数来计算模式,但似乎一个参数没有成功通过。

我在main函数中初始化countdict= dict(),然后我将其传递给mod = mode(magList, countdict)

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

但是当我在main函数中尝试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()

2 个答案:

答案 0 :(得分:0)

这行代码是你的问题。

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

Python字典是可变对象,可以在函数中更改,但字典本身不会传递给函数。只传递引用并按值传递。这意味着,当您为countdict参数指定新词典时,会丢失指向countdict函数中创建的mymain的原始参考。

答案 1 :(得分: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的{​​{1}}无论如何都是空的,因此您可能会发现最好不要将此参数传递给mode只有一个参数。