今天在程序中遇到这个奇怪问题:
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