python 2.7列表,我不知道的东西';安徒生

python 2.7列表,我不知道的东西';安徒生,python,Python,我有下面的Python2.7,这让我很疯狂,我错过了什么吗 my_list = [ { "cluster_name": "a"},{"cluster_name": "a"},{"cluster_name": "b"}] ret = [] c_list = [] for obj in my_list: #ret.append(obj) if obj["cluster_name"] not in c_list:

我有下面的Python2.7,这让我很疯狂,我错过了什么吗

    my_list = [ { "cluster_name": "a"},{"cluster_name": "a"},{"cluster_name": "b"}]

    ret = []
    c_list = []
    for obj in my_list:
        #ret.append(obj)
        if obj["cluster_name"] not in c_list:
            c_list.append(obj["cluster_name"])   
            ret.append({
                    'obj': obj,
                    'c_list': c_list
            })
    return ret
获取结果:

            "c_list": [
                "a",
                "b"      <= why b is set here?
            ],
            "obj": {
                "cluster_name": "a"
            }
        },
        {
            "c_list": [
                "a",
                "b"
            ],
            "obj": {
                "cluster_name": "b"
            }
        }
    ]
“c_列表”:[
“a”,

“b”您需要创建
c\u列表的“副本”

my_list = [ { "cluster_name": "a"},{"cluster_name": "a"},{"cluster_name": "b"}]

ret = []
c_list = []
for obj in my_list:
    #ret.append(obj)

    if obj["cluster_name"] not in c_list:
        c_list.append(obj["cluster_name"])   
        ret.append({
                'obj': obj,
                'c_list': [x for x in c_list]  # create copy!
        })
print(ret)
输出:

[{'c_list': ['a'], 'obj': {'cluster_name': 'a'}},
 {'c_list': ['a', 'b'], 'obj': {'cluster_name': 'b'}}]

事实上,我的版本是2.7.5。它没有改变任何问题,因为“集群名称”:b在您的列表中?只有一个变量c_列表。仅仅因为您将其附加到另一个数据结构并不意味着您“冻结”它仍处于当前状态。它仍然是一个列表,您可以在以后的代码中修改它。当您打印它时,您将在打印时看到它的内容;因此,如果您在最后打印一次,您将看到它的最终值,而不是中间值。Maurice Mayer的回答是正确的,但您应该理解它为什么有效。它有效在所有Python版本(以及我所知道的所有其他语言)中都是这样。太棒了!就我而言,如果[x for x in c_list]中的obj[“cluster_name”]不起作用,这很奇怪,不是吗?