具体是这样的,我有一个类,里面定义了一个列表,
class song(object):
def play(name):
if 'songlist' not in dir():
songlist = [name]
else:
songlist.append(name)
然后我调用这个类,
a = song()
a.play('abc')
但是貌似这样列表一直都是空的,应该怎样定义列表呢?
1
roricon 2015-02-05 12:38:58 +08:00
因为你类的实例里面,没有变量保持对'songlist'的引用,所以这个列表被垃圾回收了……
试着改成这样 https://gist.github.com/anonymous/f85d63702c76f078a3c4 |
2
roricon 2015-02-05 12:42:44 +08:00
|
3
messense 2015-02-05 12:51:46 +08:00 1
class song(object):
----def __init__(self): --------self.songlist = set() ----def play(self, name): --------self.songlist.add(name) |
5
roricon 2015-02-05 13:05:11 +08:00
@repus911 不用IDE感觉整个人都废了,忘记写self,3楼是正确的。
这种设置默认参数有什么问题?意思是应该直接用'[]'? |
6
hahastudio 2015-02-05 13:34:05 +08:00
@roricon 不用 [] 用 list() 说明你知道这个常见的错误
但是你没理解 比如我要是 l = ["a"] s = song(l) 这就完了,因为保留的是引用 如果真需要传一个 list 当参数,且不需要 side effect 的话,试试深拷贝一个: self.songlist = songlist[:] |
7
repus911 2015-02-05 18:56:20 +08:00
@hahastudio
你说的是一方面 函数声明的默认参数会作为一个变量保存在函数的域里面,所以你会发现 class A(object): def __init__(self, data=list()): # 或者data=[] self.data = data a = A() a.data.append(1) b = A() print b.data >>> [1] 正确的做法是像3楼那样,在函数内判断data是否为空,为空在局部生成一个。 @roricon |
8
ruoyu0088 2015-02-07 22:26:08 +08:00
如果要判断全局变量中是否有某个名字:if name in globals()
如果要判断某个实例是否包行某个属性:if hasattr(self, name) |
9
eailfly OP 3楼方法解决了问题,谢谢
|