我写了一个简单的函数来计算模式,但似乎一个参数没有成功通过。
我在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()
答案 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)
将返回包含modelist
和countdict
的元组。调用此函数时,您会写:
(mod, countdict) = mode(magList, countdict)
确保返回修改后的countdict
,这意味着您的print
函数调用不应输出空字典。
另外需要注意的是,您传入countdict
的{{1}}无论如何都是空的,因此您可能会发现最好不要将此参数传递给mode
只有一个参数。