当python方法的默认值是可变类型,要小心

229 阅读1分钟

今天在程序中遇到这个奇怪问题:

class Node:
    def __init__(self,user_id,friends = set(),degree=0):
        self.user_id = user_id
        self.friends = friends
        self.degree = degree
    
    def __str__(self):
        return "{}:{}".format(self.user_id,self.friends)

    
a = Node(1)
b = Node(2)
a.friends.add(5)
print(b)    # 2:set([5])

把问题聚焦一下:

def add(a,s = set()):
    s.add(a)
    print(s)

add(1)      # set([1])
add(2)      # set([1, 2])

总结:当方法的参数有默认值,且这个值是可变参数时,如果使用默认参数值,那这个参数是同一个对象,其id是一样的。 证明如下:

def add(a,s = set()):
    print(id(s))

add(1)          # 4327483744
add(2)          # 4327483744
add(3,set())    # 4327483976