求解释下python的类的初始化,为什么List1的操作影响到了另一个类的结果?
两段代码:
第一段:
class List(object): def __init__(self):
self.list=[]
list1=List()
list1.list.append('12')
list2=List()
print(list2.list)
结果是[]
第二段:
class List(object): def __init__(self,list=[]):
self.list=list
self.str=str
list1=List()
list1.list.append('12')
list2=List()
print(list2.list)
结果是['12']
回答:
Python的默认参数是定义的时候生成的,不是调用的时候生成的,所以第二段代码等价于:
python">defaultList = []class List(object):
def __init__(self, list=None):
if list:
self.list = list
else:
#默认参数始终指向公共的 defaultList
self.list = defaultList
list1 = List()
#list1.list 也是 defaultList
#修改 list1.list 后,defaultList 也会跟着一起被修改
list1.list.append('12')
#list2 初始化后使用的仍是公共的 defaultList,
#造成 list2.list 跟 defaultList、list1.list都是同一个东西
list2 = List()
print(list2.list)
以后每次调用的时候,默认参数其实都是引用同一个list
。这会给人造成很大的迷惑,这可能是当初设计上的失误了。
为了避免这种现象,最好的办法是,始终使用None
作为默认参数,然后用if判断来赋值。
class List(object): def __init__(self, list=None):
self.list = list if list != None else []
list1 = List()
list1.list.append('12')
list2 = List()
print(list2.list)
以上是 求解释下python的类的初始化,为什么List1的操作影响到了另一个类的结果? 的全部内容, 来源链接: utcz.com/p/938568.html