【问题标题】:How do I preserve the elements of a dictionary with each successive function call?如何在每个连续的函数调用中保留字典的元素?
【发布时间】:2017-03-24 02:36:05
【问题描述】:

为了澄清,我正在读取文件并将每一行发送到函数(1),其中相关元素被放入列表中。然后将该列表发送到另一个函数 (2) 并添加到字典中,该列表的一个元素作为键,其他元素放入另一个列表中,作为值。所以,基本上是 {key:(value(,value))。

问题是,每当我将列表从 (1) 发送到 (2) 时,新创建的字典都会被覆盖。我是 Python 新手,但我很确定我可以将多个键和值添加到一个字典中,对吗?那么,有没有办法在每次调用(2)时保存字典的元素?所以,如果它被调用一次,它在字典中有标记(a)。再次调用它时,它仍然有令牌(a),现在添加了令牌(b),依此类推。

如果您需要代码,我可以包含它。

MCVE:

def file_stuff(file name):
    #opens and reads file using with x open as thing....then
    for line in thing:
       function1(line)


def function1(line):
    #Breaks down line using regex; variable name var for this example
    #list the relevant components of the line will go into 
    element = list()

    for x in var:
       list.append(x)

    function2(element)


def function2(element):
    #Another list is made along with a dictionary
    webster = dict()
    values = list()

    for x in range(len(element)):
        #inserts into dictionary.....the problem being, however, that I need this dictionary to "remember" what was already stored inside

【问题讨论】:

  • 尝试创建mcve 来解释您的问题并将其发布在此处。帮助我们帮助您...
  • 我提供的伪代码够不够?

标签: python list function python-3.x dictionary


【解决方案1】:

在您当前的代码中,websterfunction2 中绑定到字典的局部变量。但是,您永远不会 return 或对字典执行任何其他操作,以允许该函数之外的代码看到它,因此当函数结束时,不再引用字典,它将被垃圾收集。

如果您希望对function2 的每次调用都使用相同的字典,您需要更改函数,以便它以不同的方式访问字典。究竟哪种方式最好取决于您的程序的更大设计。

一种选择是使webster 成为一个全局变量,function2 可以就地修改它。这很容易做到,但它有一些非常严重的限制,因为一个模块只有一个全局命名空间。处理应将数据放入多个不同字典的多个文件将非常困难。

看起来像这样:

webster = {}

def function2(element):
    ...
    webster[some_key] = some_value

另一种选择是将字典作为函数的参数,以便调用代码负责在调用之间创建和保存对它的引用。这可能是比使用全局变量更好的方法,但对我来说更难证明,因为我不清楚字典应该在你的示例中的位置(可能在 function1 中,或者可能需要通过所有从file_stuff)。

它可能看起来像:

def caller():
    the_dict = {}

    for item in some_sequence():
        function2(item, the_dict)

def function2(item, webster)
    ...
    webster[some_key] = some_value

最后的选择是让function2 仍然负责创建字典,但要让return 将字典交给调用者,调用者可以对它做一些事情(例如将其内容与字典合并从以前的电话)。我什至不会尝试演示这一点,因为合并过程在很大程度上取决于您在字典中输入的内容。 (一个相关的选项是返回一些其他的非字典值(或值的元组),然后可以通过调用代码将其插入字典中。在某些情况下,这可能比处理中间字典更容易。)

【讨论】:

  • 解释得很好。
  • 感谢您的广泛回复。我会全力以赴
猜你喜欢
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
相关资源
最近更新 更多