【发布时间】:2020-06-23 12:27:30
【问题描述】:
我有一个函数,其中包含类似于下面的代码,它接受一个 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']}
为什么排序不保留在函数之外?
【问题讨论】:
-
当包含函数离开时,对局部变量的更改(通过为其分配另一个对象)将丢失。新创建的 OrderedDict 永远不会转义该函数。只保留对对象本身的更改(例如,当作为参数传递给函数时)。
-
您的排序字典永远不会“离开功能”。您只是将它分配给一个局部变量,该变量在函数结束时消失。
-
当您执行
ordered_dict = ...时,您是在本地范围内创建一个新的ordered_dict变量,而不是修改外部变量。 -
这能回答你的问题吗? How do I pass a variable by reference?
-
@jasonharper 这完美地回答了我的问题,谢谢!我不知道它会分配为局部变量。
标签: python ordereddict