码迷,mamicode.com
首页 > 编程语言 > 详细

python列表隐藏的大坑

时间:2015-01-08 19:58:26      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:

今天在编写一段代码时,发现在定义类属性时,遇到了一个十分诡异的问题。

具体多诡异的呢?请看如下代码,我定义了一个类:

class sms: #定义一个短信类
    content=list() #设置了一个content属性,是一个列表,来储存短信
    def add(self,text):#添加短信
        self.content.append(text)
>>> obj1=sms()
>>> obj1.add("短信内容1")
>>> obj1.content
[短信内容1]
>>>

 我们创建了实例obj1,并向content属性添加了一个元素。下面我们再创建实例obj2:

 

>>> obj2=sms()
>>> obj2.add("短信内容2")
>>> obj2.content#再打印看看,嗯?诡异的现象出现了!
[短信内容1, 短信内容2]
>>>

我们知道,创建同一个类的两个不同实例,对一个实例的属性进行修改,是不会影响到另外一个实例的。

但是在这段代码中,我们却惊讶的发现,向obj1的content属性中添加一个元素‘短信内容1‘,这个元素居然也出现在obj2的content属性当中!

果真闹鬼了。。。。。。。记得当时我楞着看代码看了半天,也没想通是怎么回事,哈其实我才刚刚学习python,出现这个问题的确挺虐心的,这和oop的基本概念明显不符嘛!难道是python解释器出了bug?

经过了我的一番折腾,终于找到了问题所在。真相,只有一个!

那就是,obj1实例和obj2实例的content属性,其实是同一个列表!更准确的说,这两个属性指向了同一个列表对象!

【留坑以后补充】

python列表隐藏的大坑

标签:

原文地址:http://www.cnblogs.com/frapples/p/4211466.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!