求解释下python的类的初始化,为什么List1的操作影响到了另一个类的结果?

求解释下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

回到顶部