如何通过每次连续的函数调用保留字典的元素?

时间:2017-03-24 02:36:05

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

为了澄清,我正在从一个文件中读取并将每一行发送到一个函数(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

1 个答案:

答案 0 :(得分: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字典发给它的调用者,谁可以用它来做某事(比如合并它)内容与以前的电话中的词典)。我甚至都没有尝试演示这个,因为合并过程在很大程度上取决于你在字典中的确切含义。 (相关的选项是返回一些其他非字典值(或值的元组),然后可以通过调用代码将其插入字典中。这可能比在某些情况下处理中间字典更容易。)< / p>