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关键字将其作为全局数据部分中的变量引用。 关于它们的一些参考资料:
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)