我有一个功能。在里面,我正在维护一本价值字典。 我希望在不同的函数调用之间维护该字典
假设dic是:
a = {'a':1,'b':2,'c':3}
第一次打电话时,我说[a]改为100
Dict变为a = {'a':100,'b':2,'c':3}
在另一个电话中,我将[b]更改为200
我希望那个词组是a = {'a':100,'b':200,'c':3}
但在我的代码中,[a]不会保留为100.它会更改为初始值1.
我需要尽快回答......我已经迟到了......请帮助我的朋友......
答案 0 :(得分:17)
你可能在谈论一个可调用的对象。
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
词典。
答案 1 :(得分:15)
您可以使用static variable:
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
答案 2 :(得分:6)
如果在函数内创建'a'。它超出了范围。只需在函数外部(以及调用函数之前)创建它。通过这样做,程序离开函数后不会删除列表/哈希。
a = {'a':1,'b':2,'c':3}
# call you funciton here
答案 3 :(得分:5)
而不是在代码库上强制全局变量(可能是调用者的决定),我更喜欢保持状态与函数实例相关的想法。一个类对此有好处,但是没有很好地沟通你想要完成的东西,并且可能有点冗长。在我看来,利用封闭装置会更加清洁。
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重新分配给其他变量。我使用的工作是将我计划重新分配的所有变量放入每个变量或字典的单个元素列表中。
答案 4 :(得分:3)
你可以使用Python的行为来“欺骗”默认参数。默认参数仅评估一次;它们会在每次调用函数时重复使用。
>>> def testFunction(persistent_dict={'a': 0}):
... persistent_dict['a'] += 1
... print persistent_dict['a']
...
>>> testFunction()
1
>>> testFunction()
2
这不是最优雅的解决方案;如果有人调用该函数并传入一个参数,它将覆盖默认值,这可能不是你想要的。
如果你只想快速而肮脏地获得结果,那就行了。如果你正在做一些更复杂的事情,最好将它分解为像S. Lott所提到的那样。
编辑:重命名字典,以便根据下面的评论隐藏内置dict
。
答案 5 :(得分:3)
就个人而言,我喜欢全球声明的想法。它不引入全局变量,但声明本地标识符实际上是指全局名称空间中的一个。
d = dict()
l = list()
def foo(bar, baz):
global d
global l
l.append(bar, baz)
d[bar] = baz
在python 3.0中,还有一个“非本地”声明。
答案 6 :(得分:2)
在我看来,这个问题没有一个优雅的答案。选项是可调用对象,默认值和属性黑客。可调用对象是正确的答案,但它们为另一种语言中的单个“静态”声明带来了许多结构。默认值是对代码的一个小改动,但它很麻烦,可能会让一个新的python程序员看到你的代码而感到困惑。我不喜欢它们,因为它们的存在并不是任何可能正在查看您的API的人所隐藏的。
我通常会使用属性hack。我首选的方法是:
def myfunct():
if not hasattr(myfunct, 'state'): myfunct.state = list()
# access myfunct.state in the body however you want
这使状态的声明保持在它所属的函数的第一行,并将myfunct保持为函数。缺点是每次调用函数时都要进行属性检查。在大多数代码中,这几乎肯定不会成为瓶颈。