1

我有一个函数,其中包含类似于下面的代码,它接受一个 OrdredDict 对象和一个字符串作为参数:

def AddToOrderedDict(ordered_dict, new_key):
    ordered_dict[new_key] = []
    ordered_dict = OrderedDict(sorted(ordered_dict.items()))

此函数会将键添加到字典中并对其进行排序,但一旦离开该函数就不会保持排序。

下面的代码演示了这种行为:

from collections import OrderedDict

def AddToOrderedDict(ordered_dict, new_key):
    ordered_dict[new_key] = ['New', 'List']
    ordered_dict = OrderedDict(sorted(ordered_dict.items()))
    print(dict(ordered_dict))

ordered_dict = OrderedDict()
ordered_dict['A'] = ['List', 'A']
ordered_dict['C'] = ['List', 'C']
ordered_dict['D'] = ['List', 'D']

AddToOrderedDict(ordered_dict, 'B')

print(dict(ordered_dict))

输出:

{'A': ['List', 'A'], 'B': ['New', 'List'], 'C': ['List', 'C'], 'D': ['List', 'D']}
{'A': ['List', 'A'], 'C': ['List', 'C'], 'D': ['List', 'D'], 'B': ['New', 'List']}

为什么排序不保留在函数之外?

4

2 回答 2

1

您应该将结果返回到全局范围,而不是修改本地函数范围的变量:

from collections import OrderedDict

ordered_dict = OrderedDict()

def AddToOrderedDict(ordered_dict, new_key):
    ordered_dict[new_key] = ['New', 'List']
    ordered_dict = OrderedDict(sorted(ordered_dict.items()))
    print(dict(ordered_dict))
    return ordered_dict


ordered_dict['A'] = ['List', 'A']
ordered_dict['C'] = ['List', 'C']
ordered_dict['D'] = ['List', 'D']

ordered_dict = AddToOrderedDict(ordered_dict, 'B')

print(dict(ordered_dict))

编辑:改变了配方

于 2020-03-11T13:48:29.253 回答
1

python中的变量是对对象的引用。

当您传递参数时,您有两个变量指向同一个对象,一个在函数内部,一个在函数外部。

ordered_dict[new_key] = ["new","list"] 修改现有的 OrderedDict 对象。所以变化在函数之外是可见的。

另一方面,ordered_dict = OrderedDict(sorted(ordered_dict.items())) 创建一个新的 OrderedDict 并更改函数中的 ordered_dict 变量以引用它,它对主程序中的 ordered_dict 变量没有影响。

如果您可以使用外部库,您可能需要查看 sortedcontainers 模块。


有没有办法直接作用于传递的变量

不是一个好人。有一个可以使用的“移动到结束”功能,但可能会导致一堆不必要的运动。

我怀疑对 OrderedDict 进行就地排序的最不坏的方法是清空并重新填充它,例如。

tmp = sorted(ordered_dict.items())
ordered_dict.clear()
ordered_dict.update(tmp)

不过,Ultimatley 对每个插件都进行全面处理可能是一个糟糕的设计。如果可用,正确分类的容器可能会表现得更好。

于 2020-03-11T14:02:13.253 回答