python字典 value列表赋值, key不同的键值总被覆盖,求解

pycharming 发布于 2017/06/20 10:52
阅读 639
收藏 0
row = ['','admin','checkpoint','location','ip']
array1 = {}
for ip in iplist:
    array1[ip] = row
    if ip == ip2:
        print ip, ip1, ip2, checkpoint
        array1[ip][1] = admin
        array1[ip][3] = location
        array1[ip][4] = ip2

核心代码如上, iplist是一个列表, 迭代列表 将IP地址与目的字典中的ip对比,若相等,从字典中提取相应参数填入新的字典中。但无法获取我想要的返回结果,array1结果如下:

{u'172.96.169.31': ['/', u'admin', '/', u'location', u'172.96.169.15'],
 u'172.97.186.153': ['/', u'admin', '/', u'location', u'172.96.169.15'],
 u'172.96.169.32': ['/', u'admin', '/', u'location', u'172.96.169.15'],
 u'172.96.169.13': ['/', u'admin', '/', u'location', u'172.96.169.15']}

尽管key是正确的IP,但array1[ip][4] = ip2 这里的赋值好像出了问题 ,所有的value列表里的ip都变成同一个了。

求大神解惑

加载中
0
confused_man
confused_man

代码没贴全啊, ip2哪来的啊

0
fromdtor
fromdtor

因为你的row是可以修改的,字典array1的所有项都指向row

可以将

array1[ip] = row

改为

array1[ip] = row[:]

就没有这个问题了,其他问题依然存在。

0
p
pycharming

引用来自“fromdtor”的评论

因为你的row是可以修改的,字典array1的所有项都指向row

可以将

array1[ip] = row

改为

array1[ip] = row[:]

就没有这个问题了,其他问题依然存在。

thankyou ,  加了[:]以后满足了我的需要了。 这里面的原理是什么呢

0
安西都护府首席程序员
安西都护府首席程序员

row[:]是列表生成器。表示从row 截取整个列表赋值给新的变量array1[ip]

row 是指针,因此array1[ip]=row 赋值之后也就是array[ip]跟row指向同一片内存

 array1[ip][1] = admin

的更改是对row指针指向的内容。至始至终操作的都是同一片内存,当然是相同的

0
p
pycharming

引用来自“安西都护府首席程序员”的评论

row[:]是列表生成器。表示从row 截取整个列表赋值给新的变量array1[ip]

row 是指针,因此array1[ip]=row 赋值之后也就是array[ip]跟row指向同一片内存

 array1[ip][1] = admin

的更改是对row指针指向的内容。至始至终操作的都是同一片内存,当然是相同的

thank you. 解答的很详细。非常感谢。

0
开源中国-首席营养师

字串对象是引用的,你所有的赋值都是由一个对象完成,所以,就全一样了

返回顶部
顶部