Python 2.7 AWS Lambda、python 2.7和变量生命周期

Python 2.7 AWS Lambda、python 2.7和变量生命周期,python-2.7,amazon-web-services,scope,aws-lambda,global-variables,Python 2.7,Amazon Web Services,Scope,Aws Lambda,Global Variables,我发现,在函数创建/更新之后(可能是在容器替换之后,但没有测试它),不在主函数中但在全局范围内的python指令只运行一次,这导致函数在第一次和所有后续启动时的行为不同。测试代码: assets = [] print "======0. should be [] ========" print(assets) def lambda_handler(event, context): global assets print "======l. should be [] ==

我发现,在函数创建/更新之后(可能是在容器替换之后,但没有测试它),不在主函数中但在全局范围内的python指令只运行一次,这导致函数在第一次和所有后续启动时的行为不同。测试代码:

assets = []
print "======0. should be [] ========"
print(assets)   

def lambda_handler(event, context):
    global assets

    print "======l. should be [] ========"
    print(assets)   

    assets.append({
            "key": "val"
        })
    print "======2. should be [{'key': 'val'}] ========"
    print(assets)

    assets = {"data":assets}
    print "======3. should be {'data': [{'key': 'val'}]} ========"
    print(assets)
当我第一次运行该函数时(或更新后),我有:

这就是我所期望的,尽管我不明白为什么输出在“开始”之前开始。 问题是:当我下次运行它时,
assets
变量已经有了旧值:

START RequestId: 66999707-51f1-11e8-b21a-9963eeb4aa56 Version: $LATEST
======l. should be [] ========
{'data': [{'key': 'val'}]}
'dict' object has no attribute 'append': AttributeError
Traceback (most recent call last):
  File "/var/task/test.py", line 11, in lambda_handler
    assets.append({
AttributeError: 'dict' object has no attribute 'append'

END RequestId: 66999707-51f1-11e8-b21a-9963eeb4aa56
如您所见,没有
====0。应为[]=======
输出,且变量已具有值


我不是Python大师,那么我是做错了什么还是一个bug了?

Lambda在重新运行时可能会或可能不会重复使用同一个函数,所以换句话说,在运行之间可能会留下一些状态-你需要确保你没有假设任何东西-因此如果你需要初始化某些东西,在函数本身中执行,而不是在全局范围中执行


这篇文章虽然是关于nodejs而不是python的,但基本上解释了它。

Lambda在重新运行时可能会或可能不会重复使用同一个函数,因此换句话说,在运行之间可能会留下一些状态-您需要确保不假设任何情况-因此,如果需要初始化某些内容,在函数本身中执行,而不是在全局范围中执行


这篇文章虽然是关于nodejs而不是python的,但基本上解释了它。

Hi Brenanan,如果我需要在全局范围内有一个变量该怎么办。我的要求是我使用aws lambda处理程序调用athena表。但它每20秒呼叫雅典娜一次。我想让它成为全局的,这样就可以避免对athena的后续调用,我可以重用resultset数据帧。我现在要做的是让它全球化。请帮助Hi Brenanan,如果我需要一个全局范围的变量怎么办。我的要求是我使用aws lambda处理程序调用athena表。但它每20秒呼叫雅典娜一次。我想让它成为全局的,这样就可以避免对athena的后续调用,我可以重用resultset数据帧。我现在要做的是让它全球化。请帮忙
START RequestId: 66999707-51f1-11e8-b21a-9963eeb4aa56 Version: $LATEST
======l. should be [] ========
{'data': [{'key': 'val'}]}
'dict' object has no attribute 'append': AttributeError
Traceback (most recent call last):
  File "/var/task/test.py", line 11, in lambda_handler
    assets.append({
AttributeError: 'dict' object has no attribute 'append'

END RequestId: 66999707-51f1-11e8-b21a-9963eeb4aa56