4

我有一个功能。在里面,我正在维护一个值字典。我希望在不同的函数调用之间维护该字典

假设 dic 是:

a = {'a':1,'b':2,'c':3}

在第一次通话时,比如说,我将 a[a] 更改为 100 Dict 变为a = {'a':100,'b':2,'c':3}

在另一个电话中,我将 a[b] 更改为 200 我希望该 dic 成为a = {'a':100,'b':200,'c':3}

但在我的代码中,a[a] 不会保持 100。它会变为初始值 1。

我需要尽快回答......我已经迟到了......请帮助我的朋友......

4

7 回答 7

18

您可能在谈论可调用对象。

class MyFunction( object ):
    def __init__( self ):
        self.rememberThis= dict()
    def __call__( self, arg1, arg2 ):
        # do something
        rememberThis['a'] = arg1
        return someValue

myFunction= MyFunction()

从那时起,将 myFunction 用作一个简单的函数。您可以使用 访问rememberThis字典myFunction.rememberThis

于 2009-01-07T11:13:21.813 回答
15

您可以使用静态变量

def foo(k, v):
  foo.a[k] = v
foo.a = {'a': 1, 'b': 2, 'c': 3}

foo('a', 100)
foo('b', 200)

print foo.a
于 2009-01-07T06:25:35.263 回答
7

与其在代码库上强制使用全局变量(这可能是调用者的决定),我更喜欢保持与函数实例相关的状态的想法。一个类对此有好处,但不能很好地传达你想要完成的内容,并且可能有点冗长。在我看来,利用闭包要干净得多。

def function_the_world_sees():
    a = {'a':1,'b':2,'c':3}

    def actual_function(arg0, arg1):
        a[arg0] = arg1
        return a

    return actual_function
stateful_function = function_the_world_sees()

stateful_function("b", 100)    
stateful_function("b", 200)

要记住的主要注意事项是,当您在“actual_function”中进行分配时,它们会发生在“actual_function”中。这意味着您不能将 a 重新分配给不同的变量。我使用的解决方法是将我计划重新分配的所有变量放入每个变量的单个元素列表或字典中。

于 2009-01-07T14:39:05.470 回答
6

如果在函数内部创建了“a”。它超出了范围。只需在函数外部(在调用函数之前)创建它。通过这样做,程序离开函数后不会删除列表/散列。

a = {'a':1,'b':2,'c':3}

# call you funciton here
于 2009-01-07T06:26:29.473 回答
3

您可以使用 Python 的默认参数行为“作弊”。默认参数只计算一次;它们在每次调用函数时都被重用。

>>> def testFunction(persistent_dict={'a': 0}):
...     persistent_dict['a'] += 1
...     print persistent_dict['a']
...
>>> testFunction()
1
>>> testFunction()
2

这不是最优雅的解决方案;如果有人调用该函数并传入一个参数,它将覆盖默认值,这可能不是您想要的。

如果您只是想要一种快速而肮脏的方式来获得结果,那将是可行的。如果您正在做一些更复杂的事情,最好将其分解到像 S. Lott 提到的类中。

编辑:重命名字典,这样它就不会dict按照下面的评论隐藏内置。

于 2009-01-07T13:59:00.013 回答
3

就个人而言,我喜欢全局声明的想法。它没有引入全局变量,但指出本地标识符实际上是指全局命名空间中的一个。

d = dict()
l = list()
def foo(bar, baz):
    global d
    global l
    l.append(bar, baz)
    d[bar] = baz

在 python 3.0 中还有一个“非本地”语句。

于 2009-01-08T00:26:50.727 回答
3

在我看来,这个问题没有一个优雅的答案。选项是可调用对象、默认值和属性黑客。可调用对象是正确的答案,但它们为另一种语言中的单个“静态”声明带来了很多结构。默认值是对代码的微小更改,但它很笨拙,并且可能会让新的 Python 程序员在查看您的代码时感到困惑。我不喜欢它们,因为它们的存在并没有对任何可能正在查看您的 API 的人隐藏。

我通常会使用属性破解。我的首选方法是:

def myfunct():
    if not hasattr(myfunct, 'state'): myfunct.state = list()
    # access myfunct.state in the body however you want

这将状态声明保留在其所属函数的第一行,并将 myfunct 保留为函数。缺点是每次调用函数时都要进行属性检查。这几乎肯定不会成为大多数代码的瓶颈。

于 2009-01-07T21:35:00.670 回答