首先,我们查看下面这段代码所导致的错误
for subnet_info_index in subnet_infos:
# import pdb
# pdb.set_trace()
network_policy ={}
network_policy['src_ip'] = subnet_info_index['cidr']
for subnet_dst in subnet_infos:
network_policy['dst_ip'] = subnet_dst['cidr']
network_policy_list.append(network_policy)
这个结果错误的主要原因是由于在python 中只有int,float,bool是传值,其他的都是传引用。
在这个函数中只创建了2次
network_policy
对象,因此list里面其实只有2个对象存储,改一个,另外一个也跟着改了 。
而每个对象里面是有个2个Item ,所以是4个元素。
修改的具体方法,经测试使用了2个,可以任意选择一个进行:
【法一】可以如下:
print "=======xxxxx=========="
network_policy_list=[]
subnet_infos=[{"cidr":"1.1.1.1"},{'cidr':"2.2.2.2"}]
#network_policy ={}
for subnet_info_index in subnet_infos:
network_policy ={}
network_policy['src_ip'] = subnet_info_index['cidr']
for subnet_dst in subnet_infos:
network_policy['dst_ip'] = subnet_dst['cidr']
print network_policy
network_policy_list.append(network_policy.copy())
#print network_policy_list
print network_policy_list
print "=======xxxxx=========="
上述拷贝能成功,是因为:
Dict.copy() 将一个Dict拷贝给另一个Dict,而不是传索引(是内容拷贝了一份,相当于值传递了),如
>>> Dict_1 = Dict.copy()
>>> Dict_1['a'] = 0
>>> Dict_1,Dict
{'a':0,'b':2,'c':3,'d':4},{'a':1,'b':2,'c':3,'d':4}
如果是Dict_1 = Dict 那么任意dict改变之后,另外一个也会改变,=号赋值是引用传递
【法2】
print "=======xxxxx=========="
network_policy_list=[]
subnet_infos=[{"cidr":"1.1.1.1"},{'cidr':"2.2.2.2"}]
#network_policy ={}
for subnet_info_index in subnet_infos:
network_policy ={}
#network_policy['src_ip'] = subnet_info_index['cidr']
src_ip = subnet_info_index['cidr']
for subnet_dst in subnet_infos:
network_policy ={}
network_policy['src_ip'] = src_ip
network_policy['dst_ip'] = subnet_dst['cidr']
print network_policy
network_policy_list.append(network_policy)
#print network_policy_list
print network_policy_list
print "=======xxxxx=========="
上述方法就是:虽然还是用的引用传递,但是由于每次传递的对象都是新的,引用的对象也就都是新的,所以就不存在最开始的问题了。