python编程中字典插入数组的误区

最近在写一个python代码的时候遇到了一个问题,将一个字典类型的变量插入数组中时,当该字典变量的某个key对应的value发生变化时,数组的内容同时也会发生变化。这里来验证一下。

首先,进入python工作环境

root@ubuntu-50:~# python
Python 2.6.5 (r265:79063, Feb 27 2014, 19:43:51) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
定义一个数组,一个字典,并将字典append到数组中去

>>> arr = []
>>> dict = {'name':'a', 'number':'1'}
>>> arr.append(dict)
>>> print arr
[{'name': 'a', 'number': '1'}]
可以看到,此时字典dict已成功插入到数组arr中。此时我们改变字典dict中number的value,再看一下此时数组的内容

>>> dict['number'] = '2'
>>> print arr
[{'name': 'a', 'number': '2'}]
我们发现,当改变了字典的同时,数组arr的内容也会发生改变。这里推测,python中字典插入数组时,数组存放的只是该字典变量的地址或引用或别名(c++说法,刚学python没多久,还是习惯用c++来解释)。

但是在有些情况下不想出现这种现象,比如在一个循环里不断往数组中插入字典,但字典中只改变的是某个字段的value。如果我们将字典变量赋给另一个字典变量dict1,然后将dict1插入数组,dict发生改变数组会变么?

>>> arr = []
>>> dict = {'name':'b', 'number':'10'}
>>> dict1 = dict
>>> arr.append(dict1)
>>> print arr
[{'name': 'b', 'number': '10'}]
>>> dict['number'] = '20'
>>> print arr
[{'name': 'b', 'number': '20'}]

验证发现,结果没有任何改变。这时候我们要怎么办呢?


上边这个问题我们先搁置一下,来测试一下字符串插入数组后当字符串变量发生改变后数组的内容会不会发生变化。

>>> str1 = 'hello'
>>> arr.append(str1)
>>> print arr
[{'name': 'a', 'number': '2'}, 'hello']
>>> str1 = 'world'
>>> print arr
[{'name': 'a', 'number': '2'}, 'hello']
通过对比我们发现,字符串变量发生改变是不会造成数组的变化的。那么回到上边提出的问题,我们可以将字典先转化为字符串赋给字符串变量,然后将该字符串再转化为字典重新赋给另一个字典变量。如下测试

>>> dict2 = {'name':'b', 'number':'10'}
>>> str2 = str(dict2)
>>> print str2
{'name': 'b', 'number': '10'}
>>> temp = eval(str2)
>>> print temp
{'name': 'b', 'number': '10'}
>>> arr.append(temp)
>>> print arr
[{'name': 'a', 'number': '2'}, 'hello', {'name': 'b', 'number': '10'}]
此时再改变dict2,不会引起数组的变化。

>>> dict2['number'] = '20'
>>> print arr
[{'name': 'a', 'number': '2'}, 'hello', {'name': 'b', 'number': '10'}]

下边写一个简单的伪代码,说明一下以上测试可能会用到的场景。

arr = []
ret = {'name':'lucy', 'number':1}
for i in range(10):
	ret['number'] = i + 1
	temp = str(ret)
	temp2 = eval(temp)
	arr.append(temp2)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值