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

阅读 1.2k
1 个回答

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)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题