在多个函数调用后保持变量的生命周期?

时间:2017-06-04 00:44:13

标签: python scope

假设:

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

是否有一个关键字来阻止变量(my_list)被重新分配? 我们假设NA是关键字:

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

以这种方式读取行并且不重新分配,但变量仍然有效,为每个函数调用附加新值。我知道GLOBAL变量,但我只想知道关键字是否存在!

4 个答案:

答案 0 :(得分:0)

您可以像在C / C ++中一样全局声明变量,并在python中使用global关键字将它们作为全局数据部分中的变量引用。 关于它们的一些参考文献:

答案 1 :(得分: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

答案 2 :(得分:0)

我相信你所寻求的行为几乎就是python中默认参数的可变性:仅在函数定义期间实例化。

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

*args将保护列表不会被错误传递的第二个参数覆盖。

答案 3 :(得分: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(或可变的默认参数)允许您多次使用键功能。但是,如果使用类函数变得稍大,则可能是最佳选择。