gpt4 book ai didi

python - 循环更新列表中的项目

转载 作者:行者123 更新时间:2023-11-30 23:36:34 25 4
gpt4 key购买 nike

我有一个这样的函数:

def main2():
props = []
prop_list = []
i=0
while (i < 10):
new_prop = {
'i': 1
}
props.append(new_prop)
prop_list.append({'i': 1, 'props': props,})
if i == 0:
print prop_list
i += 1
print prop_list[0]

它输出:

[{'i': 1, 'props': [{'i': 1}]}]
{'i': 1, 'props': [{'i': 1}, {'i': 1}, {'i': 1}, {'i': 1}, {'i': 1}, {'i': 1}, {'i': 1}, {'i': 1}, {'i': 1}, {'i': 1}]}

为什么最终打印的内容与第一次打印的内容不一样?当我追加新元素时,列表中先前添加的元素似乎正在更新。

最佳答案

有了这一行,

prop_list.append({'i': 1, 'props': props,})

字典包含 props 列表对象。该列表在循环的后续迭代中发生变化:

props.append(new_prop)

prop_list[0]打印的最终值反射(reflect)了这一变化。

<小时/>

这是单独的同一件事:

In [23]: x = []

In [24]: y = {'foo': x}

In [25]: y
Out[25]: {'foo': []}

In [26]: z = {'baz': x}

In [27]: x.append('bar') # x is mutated

In [28]: y
Out[28]: {'foo': ['bar']} # both y and z are affected

In [29]: z
Out[29]: {'baz': ['bar']}
<小时/>

如果您不希望发生这种情况,请复制该列表。要制作 props 的浅拷贝,请使用 props[:]:

prop_list.append({'i': 1, 'props': props[:]})

请注意,浅拷贝 props[:]一个新列表,其中包含与 props 完全相同的项目。这意味着如果 props 包含可变项(例如列表),则更改该列表将影响 props 及其浅拷贝。

要对 props 中的所有项目进行深层复制(递归地),请使用

import copy
prop_list.append({'i': 1, 'props': copy.deepcopy(props)})

关于python - 循环更新列表中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16428446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com