为什么添加到 OrderedDict 并在函数内部排序的键不会在函数外部保持排序?
Why do keys added to an OrderedDict and sorted inside of a function not stay sorted outside the function?
我有一个函数包含类似于下面的代码,它接受一个 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']}
为什么排序不保存在函数外?
与其修改局部函数作用域的变量,不如return将结果添加到全局作用域:
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))
编辑:更改了公式
python 中的变量是对对象的引用。
当你传递参数时,你有两个变量指向同一个对象,一个在函数内部,一个在函数外部。
ordered_dict[new_key] = ["new","list"] 修改现有的 OrderedDict 对象。所以变化在函数外是可见的。
ordered_dict = OrderedDict(sorted(ordered_dict.items())) 另一方面创建一个新的 OrderedDict 并更改函数中的 ordered_dict 变量以引用它,它有对主程序中的 ordered_dict 变量没有影响。
如果您可以使用外部库,您可能需要查看 sortedcontainers 模块。
Is there a way to act directly upon the passed variable
不太好。有一个可以使用的"move to end"功能,但可能会导致一堆不必要的动作。
我怀疑就地对 OrderedDict 进行排序的最不坏的方法是清空并重新填充它,例如。
tmp = sorted(ordered_dict.items())
ordered_dict.clear()
ordered_dict.update(tmp)
最后,对每个插入都进行全面求助可能是一个糟糕的设计。如果可用,经过适当排序的容器可能会表现得更好。
我有一个函数包含类似于下面的代码,它接受一个 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']}
为什么排序不保存在函数外?
与其修改局部函数作用域的变量,不如return将结果添加到全局作用域:
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))
编辑:更改了公式
python 中的变量是对对象的引用。
当你传递参数时,你有两个变量指向同一个对象,一个在函数内部,一个在函数外部。
ordered_dict[new_key] = ["new","list"] 修改现有的 OrderedDict 对象。所以变化在函数外是可见的。
ordered_dict = OrderedDict(sorted(ordered_dict.items())) 另一方面创建一个新的 OrderedDict 并更改函数中的 ordered_dict 变量以引用它,它有对主程序中的 ordered_dict 变量没有影响。
如果您可以使用外部库,您可能需要查看 sortedcontainers 模块。
Is there a way to act directly upon the passed variable
不太好。有一个可以使用的"move to end"功能,但可能会导致一堆不必要的动作。
我怀疑就地对 OrderedDict 进行排序的最不坏的方法是清空并重新填充它,例如。
tmp = sorted(ordered_dict.items())
ordered_dict.clear()
ordered_dict.update(tmp)
最后,对每个插入都进行全面求助可能是一个糟糕的设计。如果可用,经过适当排序的容器可能会表现得更好。