
具体是这样的,我有一个类,里面定义了一个列表,
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楼方法解决了问题,谢谢 |