如何在Python列表中保留查询参数?代码输出异常排查
解决Python列表中保留不同查询参数的问题
Hey,我看到你遇到的问题了——循环生成测试用例列表时,所有项的query都变成了最后一个值"london",而不是预期的"obama"和"london"。这是个Python里很常见的可变引用类型陷阱,咱们来一步步搞定它。
问题根源
你在循环外部定义了tests = {}这个字典,每次循环只是修改这个字典的内容,再把它插入到append_all_tests列表中。但字典是可变引用类型,列表里存储的不是字典的副本,而是指向同一个字典的"指针"。循环结束后,所有列表元素指向的都是最后一次修改后的那个字典,所以所有query自然都是最后一个值。
修复方案
解决思路很简单:每次循环都创建一个全新的tests字典,而不是复用同一个。这样列表里的每个元素都是独立的字典,不会互相影响。另外,如果后续params或expectations可能被修改,最好做浅拷贝避免意外的引用问题。
修复后的代码如下:
if __name__ == '__main__': testcases = {} params = {"locale": "US"} expectations = {"type": ["president", "city"]} append_all_tests = [] main_input = {} testcases["queries"] = ["obama", "london"] for i, q in enumerate(testcases['queries']): # 每次循环新建一个tests字典,确保独立性 tests = {} # 若params后续可能被修改,建议用params.copy()做浅拷贝 tests["parameters"] = params # 同理,expectations有变动需求时也用copy tests["expectations"] = expectations tests["query"] = q append_all_tests.insert(i, tests) main_input["tests"] = append_all_tests print(main_input)
额外优化提示
如果params或expectations包含嵌套的可变对象(比如内部还有字典、列表),仅仅赋值可能还是会有引用问题,这时候需要用浅拷贝或深拷贝:
- 浅拷贝:
params.copy()或者dict(params) - 深拷贝:需要导入
copy模块,使用copy.deepcopy(params)
验证结果
现在运行代码,main_input["tests"]会生成两个独立的测试用例,分别带有query: "obama"和query: "london",完全符合你的预期。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

