Python分配字符串格式的返回值行为是不一致的

时间:2016-03-31 19:00:37

标签: python string python-3.x dictionary

当指定python字符串格式返回值如'67.67.%s.%s' % (str(j), str(i))时,在指定字典的键和指定字典的子字典中的键之间不一致。

例如:

i = 0
j = 1
dict_template = {"id": "1", "another_dict": {"value": "hello"}}
dict_list = []
for idx in list(range(2, 1002)):
    new_dict = copy.copy(dict_template)
    new_dict['id'] = 'obj_id_%s' % str(idx)
    new_dict['another_dict']['value'] = '67.67.%s.%s' % (str(j), str(i))
    dict_list.append(new_dict)
    if i < 254:
        i += 1
    else:
        j += 1
        i = 1

在这个例子中,每个new_dict ['another'] ['value']都是相同的字符串并具有相同的id。 但是,如果我将此行new_dict['another_dict']['value'] = '67.67.%s.%s' % (str(j), str(i))更改为new_dict["another_dict"] = '67.67.%s.%s' % (str(j), str(i)),则每个new_dict [“another_dict”]都会有不同的值。

顺便说一句,我使用的是Python 3.4.3。

1 个答案:

答案 0 :(得分:1)

copy.copy执行给定参数的浅拷贝。这意味着它会创建一个新的dict并为它添加引用(而不是副本)到第一个dict中已经存在的所有内容。对于字符串和数字等不可变的东西,没有问题。但是每个实例都指向相同的(可变的)内部字典。

相反,您需要使用copy.deepcopy。它将以递归方式为模板参数的每个属性创建新副本。