替换对象中键值对的Python函数返回意外输出

替换对象中键值对的Python函数返回意外输出,python,python-3.x,Python,Python 3.x,我写的代码是: def function_1(object_1, list_1): list_to_return = [] for x in list_1: object_1['key_1'] = [x] list_to_return.append(object_1) return list_to_return if __name__ == "__main__": object_main = { "key_1":['item1'], "k

我写的代码是:

def function_1(object_1, list_1):
list_to_return = []
for x in list_1:
    object_1['key_1'] = [x]
    list_to_return.append(object_1)
return list_to_return

if __name__ == "__main__":
    object_main = {
        "key_1":['item1'],
        "key_2":['item1', 'item2']
    }
    list1_main = ['1','2', '3']
    ret_val = function_1(object_main, list1_main)
    print(ret_val)
编写该代码是为了用list:list1\u main中的每个项替换对象中键1的项。该函数将按预期替换函数中的键。但print语句的输出如下所示:

预期产出为:

不知道代码为什么会这样做。
Python版本:3.8

您通过引用传递,关键是在dict上使用
.copy
。请注意,以下解决方案中返回的列表将不包含对原始dict的任何引用,但原始dict将受到影响。如果您想保留原始的dict,那么我建议您也生成一个深度副本


def function_1(object_1:Dict, list_1):
    list_to_return = []
    for x in list_1:
        object_1['key_1'] = [x] # here u may want to manipulate a copy of ur dict instead
        list_to_return.append(object_1.copy()) # here we copy the dict

    return list_to_return

if __name__ == "__main__":
    object_main = {
        "key_1":['item1'],
        "key_2":['item1', 'item2']
    }
    list1_main = ['1','2', '3']
    ret_val = function_1(object_main, list1_main)
    print(ret_val)

您每次都在
列表中添加相同的词典以返回
。因为字典是可变的。你应该每次都复制它。此外,如果您正在更改给定的dict,您也应该复制它:

def函数_1(对象_1,列表_1):
object_1=object_1.copy()
列表到返回=[]
对于列表_1中的x:
对象_1['key_1']=[x]
list_to_return.append(object_1.copy())
返回列表\u至\u返回
如果名称=“\uuuuu main\uuuuuuuu”:
对象_main={
“键1”:['item1'],
“键2”:['item1','item2']
}
列表1_main=['1','2','3']
ret_val=函数_1(对象_main,列表1_main)
打印(检索)

您正在将相同的对象/引用附加到
列表\u以返回
。原始列表中的更改将显示在引用的任何位置。我们通过引用传递,传递副本。谢谢。成功了。我把这一行改为list_to_return.append(dict(object_1))