如何判断一个列表是否存在?存在就添加项,否则就新建列表。

2015-02-05 11:44:18 +08:00
 eailfly

具体是这样的,我有一个类,里面定义了一个列表,

class song(object):
def play(name):
if 'songlist' not in dir():
songlist = [name]
else:
songlist.append(name)

然后我调用这个类,

a = song()
a.play('abc')

但是貌似这样列表一直都是空的,应该怎样定义列表呢?

3344 次点击
所在节点    Python
9 条回复
roricon
2015-02-05 12:38:58 +08:00
因为你类的实例里面,没有变量保持对'songlist'的引用,所以这个列表被垃圾回收了……
试着改成这样
https://gist.github.com/anonymous/f85d63702c76f078a3c4
roricon
2015-02-05 12:42:44 +08:00
messense
2015-02-05 12:51:46 +08:00
class song(object):
----def __init__(self):
--------self.songlist = set()

----def play(self, name):
--------self.songlist.add(name)
repus911
2015-02-05 13:03:03 +08:00
@roricon 类参数的第一个应该是self,还有这种设置默认参数的方式很有问题
3楼正解
roricon
2015-02-05 13:05:11 +08:00
@repus911 不用IDE感觉整个人都废了,忘记写self,3楼是正确的。
这种设置默认参数有什么问题?意思是应该直接用'[]'?
hahastudio
2015-02-05 13:34:05 +08:00
@roricon 不用 [] 用 list() 说明你知道这个常见的错误
但是你没理解
比如我要是
l = ["a"]
s = song(l)
这就完了,因为保留的是引用
如果真需要传一个 list 当参数,且不需要 side effect 的话,试试深拷贝一个:
self.songlist = songlist[:]
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
ruoyu0088
2015-02-07 22:26:08 +08:00
如果要判断全局变量中是否有某个名字:if name in globals()
如果要判断某个实例是否包行某个属性:if hasattr(self, name)
eailfly
2015-02-09 17:15:20 +08:00
3楼方法解决了问题,谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/168438

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX