具体是这样的,我有一个类,里面定义了一个列表,
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 年 2 月 5 日
因为你类的实例里面,没有变量保持对'songlist'的引用,所以这个列表被垃圾回收了……
试着改成这样 https://gist.github.com/anonymous/f85d63702c76f078a3c4 |
2
roricon 2015 年 2 月 5 日
|
3
messense 2015 年 2 月 5 日 class song(object):
----def __init__(self): --------self.songlist = set() ----def play(self, name): --------self.songlist.add(name) |
6
hahastudio 2015 年 2 月 5 日
@roricon 不用 [] 用 list() 说明你知道这个常见的错误
但是你没理解 比如我要是 l = ["a"] s = song(l) 这就完了,因为保留的是引用 如果真需要传一个 list 当参数,且不需要 side effect 的话,试试深拷贝一个: self.songlist = songlist[:] |
7
repus911 2015 年 2 月 5 日
@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 年 2 月 7 日
如果要判断全局变量中是否有某个名字:if name in globals()
如果要判断某个实例是否包行某个属性:if hasattr(self, name) |
9
eailfly OP 3楼方法解决了问题,谢谢
|