轩痕的竹林

Happy coding

python中的陷阱(1)

轩痕 posted @ Jan 23, 2011 11:54:35 AM in python with tags python 陷阱 , 955 阅读

d = {}  与  d.clear() 的区别

在工作中我想实现一个这样的效果:

在循环中把一个字典的不同状态值加入到list里面去,可是这个结果一致很异常。

看下面的问题代码:

In [1]: l = []

In [2]: p = {}

In [3]: for i in xrange(5):
   ...:     p.clear()
   ...:     p[str(i)] = i
   ...:     print p
   ...:     l.append(p)
   ...:     print l
   ...:     
   ...:     
{'0': 0}
[{'0': 0}]
{'1': 1}
[{'1': 1}, {'1': 1}]
{'2': 2}
[{'2': 2}, {'2': 2}, {'2': 2}]
{'3': 3}
[{'3': 3}, {'3': 3}, {'3': 3}, {'3': 3}]
{'4': 4}
[{'4': 4}, {'4': 4}, {'4': 4}, {'4': 4}, {'4': 4}]

 

 

发现了吗? l.append操作每次只是把对象的地址放入了队列里面进行保存,而p.clear() 这个函数不会创建新的字典,只是把原来p = {}创建的变量内容给清空了。我们每次放入l之中的都是p = {}创建的变量地址,所以导致l 里面的结果跟所想想的完全不一致。

 

作为对比,下面才是我们想要的结果。

In [6]: l = []

In [7]: for i in xrange(5):
    p = {}
    p[str(i)] = i
    print p
    l.append(p)
    print l
   ....:    
   ....:    
{'0': 0}
[{'0': 0}]
{'1': 1}
[{'0': 0}, {'1': 1}]
{'2': 2}
[{'0': 0}, {'1': 1}, {'2': 2}]
{'3': 3}
[{'0': 0}, {'1': 1}, {'2': 2}, {'3': 3}]
{'4': 4}
[{'0': 0}, {'1': 1}, {'2': 2}, {'3': 3}, {'4': 4}]

 

我们必须在for循环的开始就通过p = {} 来创建一个新的变量,跟之前的那个变量地址完全不能一样。这样才能让不同的字典加入到我们的队列里面

 

上面是我的猜测,是真的这样吗? 我们验证一下


In [20]: l = []

In [21]: for i in xrange(5):
    p = {}
    p[str(i)] = i
    print p
    l.append(p)
    print l
    p.clear()
   ....:     
   ....:     
{'0': 0}
[{'0': 0}]
{'1': 1}
[{}, {'1': 1}]
{'2': 2}
[{}, {}, {'2': 2}]
{'3': 3}
[{}, {}, {}, {'3': 3}]
{'4': 4}
[{}, {}, {}, {}, {'4': 4}]



看到了吗? clear()成员函数清空了p = {}产生的变量的内容,而列表里面仍然保存着这个空变量的地址,列表自己当然不知道了。。 所以很遗憾。。 我们什么都没得到。。 我应该在最后再打印下l , 不过其实已经没有必要了, 不是吗?

这篇文章如果没有标示转载,那版权就是偶滴,如果您想引用,请注明出自http://xuanhen.is-programmer.com
Avatar_small
依云 说:
Feb 22, 2011 08:41:53 AM

呃,我一点都没觉得这是陷阱啊。你既然没创建新的字典,那 clear 之后当然还是原来的那个呗。对于 mutable 对象,字面值总是创建一个新的实例,所以 p = {} 是丢弃了旧的 p,而新生成了一个空字典起名为 p。一个(让新手觉得)更诡异的是,以下语句是等价的:
a = b = 3
a = 3; b = 3
但以下却不是
a = b = []
a = []; b = []
像这种情况教程里已经解释得很清楚了,理解后就没事了。

civaget 说:
Jan 17, 2024 09:45:25 PM

오피타임's commitment to customer satisfaction is evident in every visit.

civaget 说:
Jan 18, 2024 05:01:51 AM

제주출장마사지's aroma massage by the sea is simply magical.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter