首先,我們檢視下面這段**所導致的錯誤
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']
這個結果錯誤的主要原因是由於在python 中只有int,float,bool是傳值,其他的都是傳引用。
在這個函式中只建立了2次
network_policy
物件,因此list裡面其實只有2個物件儲存,改乙個,另外乙個也跟著改了 。
而每個物件裡面是有個2個item ,所以是4個元素。
修改的具體方法,經測試使用了2個,可以任意選擇乙個進行:
【法一】可以如下:
print "*****==***xx**********"
network_policy_list=
subnet_infos=[,]
#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
#print network_policy_list
print network_policy_list
print "*****==***xx**********"
上述拷貝能成功,是因為:
dict.copy() 將乙個dict拷貝給另乙個dict,而不是傳索引(是內容拷貝了乙份,相當於值傳遞了),如
>>> dict_1 = dict.copy()
>>> dict_1['a'] = 0
>>> dict_1,dict
,如果是dict_1 = dict 那麼任意dict改變之後,另外乙個也會改變,=號賦值是引用傳遞
【法2】
print "*****==***xx**********"
network_policy_list=
subnet_infos=[,]
#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
#print network_policy_list
print network_policy_list
print "*****==***xx**********"
上述方法就是:雖然還是用的引用傳遞,但是由於每次傳遞的物件都是新的,引用的物件也就都是新的,所以就不存在最開始的問題了。
引用傳遞問題
using system public class test1 p.name,num static void a1 person p,int num public class person 其實這兩個引數都是值傳遞,num就不用說了,它是值型別,所以傳遞到方法中的是它的副本,而p是引用型別,但是它沒...
Python引數傳遞 引用傳遞 值傳遞
值傳遞 方法呼叫時,實際引數把它的值傳遞給對應的形式引數,方法執行中形式引數值的改變不影響實際引數的值。a1 520 a2 a1 print a1 520 print a2 520 a2 a1 1 print a2 521 print a1 520 引用傳遞 也稱位址傳遞,在方法呼叫時,實際上是把引...
JAVA引用傳遞問題
可能有些同學覺得,只要是引用傳遞,對引用的修改直接影響著原物件,其實不然,只有對引用物件的內部做了修改,才會影響原物件,如果直接將引用修改了,則對原物件沒有影響,唯一的影響就是 這個被修改的引用,現在不是原來物件的引用,而是新物件的引用。引用傳遞指的是傳遞的時候,傳遞的是物件的引用。如果對引用的內部...