python 类与实例

2013-10-10 14:17:27 +08:00
 soralley
class A:
def __init__(self, aList = []):
self.aList = aList

x = A()
y = A()

x.aList.append(...)为什么会影响到y.aList值?aList是共享的属性?怎样分离开来?
2703 次点击
所在节点    问与答
7 条回复
soralley
2013-10-10 14:19:29 +08:00
发现self.aList = aList[:]这样就可以分离开来了,但好像不容易理解,还请高手解疑!
tedd
2013-10-10 14:20:42 +08:00
参数最好不要用可变的类型吧,很容易相互相应到的
est
2013-10-10 14:24:34 +08:00
def __init__(self, aList = []):

这里的 [] 其实是隐含申明成全局变量了。

def __init__(self, aList = None):
if not aList: aList = []

这样ok了。
clino
2013-10-10 14:31:16 +08:00
好像 http://v2ex.com/t/75013 说的就是这个吧
如果用
x = A([])
y = A([])
就不会了,或者
def __init__(self, aList = None):
if aList==None:aList = []
self.aList = aList
这样也可以
soralley
2013-10-10 14:34:52 +08:00
最新发现,把默认参数拉长了就不会,好像是编译优化的问题,恩,好像
est兄正解
dreampuf
2013-10-10 16:38:28 +08:00
In [75]: def FuncA(ls=[]): ls.append(1)

In [76]: FuncA.func_defaults
Out[76]: ([],)

In [77]: FuncA()

In [78]: FuncA.func_defaults
Out[78]: ([1],)

In [79]: FuncA()

In [80]: FuncA.func_defaults
Out[80]: ([1, 1],)
piglei
2013-10-10 17:39:16 +08:00
不要使用可变类型来作为方法的默认值,具体可以了解:
http://effbot.org/zone/default-values.htm

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

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

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

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

© 2021 V2EX