2017-06-04 41 views
0

假设:在多次函数调用之后保持变量的生命期?

def myfunc(x): 
    my_list = [] 
    list.append(x) 

是有关键词来从被再分配停止一个变量(my_list)? 让我们假设NA是关键字:

def myfunc(x): 
    NA listv = [] 
    list.append(x) 

以这样的方式,该线将被读取,而不是重新分配但对于每个函数调用的变量仍然活跃追加新的价值观。我知道GLOBAL变量,但我只想知道是否存在关键字!

+0

如果你想追加*一个新值,追加它,并且如果你想要一个在函数调用中保持其值的变量,不要使它成为本地函数。 – user2357112

+0

这里没有追加到列表 –

+0

[在Python中使用“全局”关键字]的可能重复(https://stackoverflow.com/questions/4693120/use-of-global-keyword-in-python) –

回答

0

我猜你正在寻找的东西等同于Java中的final关键字。简而言之,没有这样的关键字。 Python的态度是“如果你不想修改它,只是不要修改它,我不会阻止你”。

然而,你可以通过你的课堂上的一些调整来模仿类似的东西。

class MyFinalVariablesClass: 
    def __setattr__(self, attr, value): 
     # if it already has this attribute, complain ! 
     if hasattr(self, attr): 
      raise Exception("Attempting to alter read-only value") 

     self.__dict__[attr] = value 

或者在您的变量的情况下(没有测试过)

class WriteOnceReadWhenever: 
    def __setattr__(self, attr, value): 
     if attr == 'my_list' and hasattr(self, attr): 
      raise Exception("Attempting to alter read-only value") 
     self.__dict__[attr] = value 
0

我相信你正在寻找的行为几乎完全论点Python的可变默认工作:仅在实例化功能定义。

def myfunc(x,*args,my_list=[]): 
    my_list.append(x) 

*args将保护名单由错误地传递第二个参数被覆盖。

0

没有关键字来做到这一点。有解决方法(如可变的默认参数),但有更好的方法来实现相同的事情。

的exaple您可以将变量设置为功能属性:

def my_func(): 
    my_func.my_list.append(1) 

my_func.my_list = [] 

然而,这是这样做的只是一个哈克的方式:

class MyFuncFactory: 
    def __init__(self): 
     self.my_list = [] 
    def __call__(self): 
     self.my_list.append(1) 

因此,你可能会更好写一个类的而不是这种情况下的功能。


有时你可以使用一个nonlocal变量。例如定义key功能,要求国家我平时写的东西,如:

def my_key_builder(): 
    some_state = 0 

    def key_function(arg): 
     nonlocal some_state 
     some_state += 1 
     return some_state % 2 
    return key_function 

for x in sorted(a_list, key=my_key_builder()): 
    print(x) 

使用nonlocal而不是global(或可变默认参数)允许您使用功能键多次。但是,如果功能变得稍大,使用类可能是最好的选择。

相关问题