Python append操作无效 遍历填充后字典列表始终为空问题
问题原因
两个直接bug导致结果不符合预期:
Message = str(return_value)执行时机错误。这行写在EC2实例遍历逻辑之前,此时字典内所有列表都是空的,字符串生成后不会随字典内容更新自动变化,后续SNS发送的永远是初始化阶段的空字典内容。- 列表追加逻辑写法错误。Python中
list.append()是原地修改列表的方法,返回值为None,你写的return_value['xxx'] = return_value['xxx'] + [return_value['xxx'].append(missingtag)]属于画蛇添足:先把元素追加进列表,再把原列表和[None]拼接后重新赋值,反而破坏了列表结构,完全不需要额外拼接。
修复方法
- 将
Message = str(return_value)移动到所有实例遍历逻辑执行完成、调用SNS发布接口之前,确保读取的是填充完成的最终结果。 - 删掉所有错误的列表拼接写法,直接调用
append()方法添加元素即可。 - 同步修复代码里的其他潜在问题:
- 修正合法标签分支的打印文案错误(原代码误写为"unknown builder tag value",和实际逻辑不符)
- 增加实例无Tags字段的兜底判断,避免刚创建的无标签实例触发KeyError导致Lambda运行失败
- 删掉冗余的模块导入和重复的boto3客户端/资源初始化,减少Lambda冷启动耗时
- 简化最后一个标签分支的重复判断:前面分支已经覆盖了标签缺失、空值、unknown值、合法值的场景,剩余非法值情况直接走else即可
- 修正拼写错误:
Dectected改为Detected
修复后的完整可运行代码如下:
import boto3 from botocore.exceptions import ClientError ec = boto3.client('ec2', 'us-east-1') sns_client = boto3.client('sns', 'us-east-1') def lambda_handler(event, context): reservations = ec.describe_instances().get('Reservations', []) # 初始化结果字典 return_value = { 'missingtagkeys': [], 'missingtagvalues': [], 'incorrecttagvalues': [], 'unknowntagvalues': [], 'correcttags': [] } TopicArn = 'arn:aws:sns' Subject = 'Incorrect Tags Detected' buildertag = [{ "Key": "builder", "Value": "unknown" }] for reservation in reservations: for instance in reservation['Instances']: tags = {} # 兜底处理无标签的实例 if 'Tags' in instance: for tag in instance['Tags']: tags[tag['Key']] = tag['Value'] instance_id = instance['InstanceId'] # 标签校验逻辑 if 'builder' not in tags: msg = f"{instance_id} does not have builder tag. Adding 'builder' tag with value of 'unknown'." print(msg) ec.create_tags(Resources=[instance_id], Tags=buildertag) return_value['missingtagkeys'].append(msg) elif tags['builder'] == '': msg = f"{instance_id} has no value for builder tag." print(msg) ec.create_tags(Resources=[instance_id], Tags=buildertag) return_value['missingtagvalues'].append(msg) elif tags['builder'] == 'unknown': msg = f"{instance_id} has an unknown builder tag value." print(msg) return_value['unknowntagvalues'].append(msg) elif tags['builder'] in ['a', 'b', 'c', 'd', 'e']: msg = f"{instance_id} has approved builder tags." print(msg) return_value['correcttags'].append(msg) else: msg = f"{instance_id} has an incorrect builder tag value." print(msg) return_value['incorrecttagvalues'].append(msg) # 所有遍历完成后再生成消息内容 Message = str(return_value) sns_client.publish( TopicArn=TopicArn, Subject=Subject, Message=Message ) return return_value
内容的提问来源于stack exchange,提问作者skyfire123
相关产品推荐
相关产品推荐

