You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:32:51