Python 在多次函数调用后保持变量的寿命?

Python 在多次函数调用后保持变量的寿命?,python,scope,Python,Scope,假设: def myfunc(x): my_list = [] list.append(x) 是否有关键字阻止重新分配变量(my_列表)? 假设NA是关键字: def myfunc(x): NA listv = [] list.append(x) 以这样的方式,该行将被读取,而不是重新分配,但变量仍处于活动状态,为每个函数调用追加新值。我知道全局变量,但我只想知道关键字是否存在您可以像在C/C++中那样全局声明变量,并在python中使用global关键字

假设:

def myfunc(x):
    my_list  = []
    list.append(x)
是否有关键字阻止重新分配变量(my_列表)? 假设NA是关键字:

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

以这样的方式,该行将被读取,而不是重新分配,但变量仍处于活动状态,为每个函数调用追加新值。我知道全局变量,但我只想知道关键字是否存在

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


我想您正在寻找与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
或者对于您的变量(尚未测试)


我相信您所寻求的行为几乎正是python中可变默认参数的工作方式:仅在函数定义期间实例化

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

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

没有关键字来执行此操作。有一些变通方法(比如可变默认参数),但也有更好的方法来实现同样的效果

例如,可以将变量设置为函数属性:

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)
因此,在这种情况下,编写类而不是函数可能更好


有时可以使用
非局部变量。例如,要定义一个需要状态的
函数,我通常编写如下代码:

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)

使用
非本地
而不是
全局
(或可变默认参数)可以多次使用键函数。但是,如果使用类使函数稍微变大,则可能是最佳选择。

如果要附加新值,
append
it,并且如果需要在函数调用期间保持其值的变量,不要将其设置为该函数的局部。您并不是在此列表中添加@cricket_007的可能副本:虽然这是问题的一个解决方案,但它不是唯一的解决方案。我想说,将此作为其副本关闭是有限制的。@zondo当然可以,但它可能是被问及的关键字
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)