2016-12-05 73 views
1

这里是我的代码功能不会改变参数通缉

def common_words(count_dict, limit): 
    ''' 
    >>> k = {'you':2, 'made':1, 'me':1} 
    >>> common_words(k,2) 
    >>> k 
    {'you':2} 
    ''' 
    new_list = list(revert_dictionary(count_dict).items())[::-1] 
    count_dict = {} 
    for number,word in new_list: 
     if len(count_dict) + len(word) <= limit: 
      for x in word: 
       count_dict[x] = number 

    print (count_dict) 





def revert_dictionary(dictionary): 
    ''' 
    >>> revert_dictionary({'sb':1, 'QAQ':2, 'CCC':2}) 
    {1: ['sb'], 2: ['CCC', 'QAQ']} 
    ''' 
    reverted = {} 
    for key,value in dictionary.items(): 
     reverted[value] = reverted.get(value,[]) + [key] 
    return reverted 


count_dict = {'you':2, 'made':1, 'me':1} 
common_words(count_dict,2) 
print (count_dict) 

我的预期是有count_dict变量改为{“你”:2}。 它确实做工精细的功能的print语句,但不是功能外..

+0

您必须在函数末尾返回* count_dict *,然后使用返回的值。如果您不声明它们是全局的,则函数内部修改的变量只属于该函数的名称空间。要获取函数范围外的变量值,必须使用* return *语句 – Jalo

+0

,但该函数的返回类型为None。这个函数的目的是接受发送的内容并改变它自己的内容 –

+0

'count_dict = {}'表示你正在创建一个新的本地字典,并且不再处理已经传入函数的字典。任何方式,它不是真正的Pythonic修改已作为参数传入的字典,你应该总是'返回'你想要的结果 – UnholySheep

回答

0

如前所述,问题在于count_dict = {}您没有更改传入的字典,而是创建一个新字典,并且所有后续更改都在该新字典上完成。传统的方法是只返回新的字典,但似乎你不能这样做。

或者,不是将值添加到新字典中,而是反转条件并从现有字典中删除值。尽管如此,您不能在条件中使用len(count_dict),并且必须使用另一个变量来跟踪已添加到(或者说,而不是从字典中删除)的元素。

def common_words(count_dict, limit): 
    new_list = list(revert_dictionary(count_dict).items())[::-1] 
    count = 0 
    for number,word in new_list: 
     if count + len(word) > limit: 
      for x in word: 
       del count_dict[x] 
     else: 
      count += len(word) 

还要注意的是,从字典返回revert_dictionary没有特定的顺序,太行new_list = list(revert_dictionary(count_dict).items())[::-1]不能保证给你在任何特定的顺序items,也是如此。您可能需要在此处添加sorted并按计数进行排序,但我不确定是否真的需要这一点。

new_list = sorted(revert_dictionary(count_dict).items(), reverse=True) 
+0

非常感谢! –

-1

只写

return count_dict 

下面

print count_dict 

在功能common_words()

和变化

common_words(count_dict,2) 

count_dict=common_words(count_dict,2) 

所以基本上你需要从函数的返回值,并将其存储在您的变量。当你调用函数并给它一个参数时。它将其副本发送给该函数,而不是自身变量。

+0

如果你不想返回任何东西。不要将count_dict参数传递给函数。它会自动把全局count_dict变量 – Premraj

+0

谢谢你的建议!我只是简单地弹出字典,使其全部为空,然后再次添加,并且它工作正常! –

1

的问题,因为别人已经写的,是你的函数分配空字典count_dict

count_dict = {} 

当你这样做,你修改局部变量count_dict,但程序主要部分中具有相同名称的变量继续指向原始字典。

您应该明白,您允许修改您在函数参数中传递的字典;只是不要用新的字典来代替它。为了让您的代码,而无需修改其他任何工作,你可以把它删了现有字典中的所有元素:

count_dict.clear() 

此修改已传递给函数的字典,删除其elements--所有这你的意图。也就是说,如果你正在执行一个新的计算,通常在你的函数中创建一个新的字典是一个好主意,并且用return返回它。