python 引用传递所致问题

首先,我们查看下面这段代码所导致的错误 
    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=========="

上述方法就是:虽然还是用的引用传递,但是由于每次传递的对象都是新的,引用的对象也就都是新的,所以就不存在最开始的问题了。


你可能感兴趣的:(python)