混淆python:空列表作为类init中的可选kwarg

混淆python:空列表作为类init中的可选kwarg,python,Python,我理解为什么在python中会发生以下情况,但这似乎有点违反直觉。 有人能解释一下为什么python应该这样做吗? 为什么在类G的第二次实例化时,不会再次创建空列表 class G: def __init__(self, members=[]): self.members = members def append(self, x): self.members.append(x) a = G() a.append(1) a.append(2)

我理解为什么在python中会发生以下情况,但这似乎有点违反直觉。 有人能解释一下为什么python应该这样做吗? 为什么在类G的第二次实例化时,不会再次创建空列表

class G:

    def __init__(self, members=[]):
        self.members = members

    def append(self, x):
        self.members.append(x)


a = G()
a.append(1)
a.append(2)
print(a.members)  # prints: [1, 2]

b = G()
print(b.members)  # prints: [1, 2]    <-------- why????
G类:
定义初始化(self,members=[]):
self.members=成员
def附加(self,x):
self.members.append(x)
a=G()
a、 附加(1)
a、 附加(2)
印刷品(a.成员)#印刷品:[1,2]
b=G()

print(b.members)#prints:[1,2]默认值在定义过程中计算。因此,只创建一个列表,默认值始终指向它

print(id(a.members))  
print(id(b.members))  
print(a.members is b.members)
输出:

140226208543200
140226208543200
True

默认值在定义期间计算。因此,只创建一个列表,默认值始终指向它

print(id(a.members))  
print(id(b.members))  
print(a.members is b.members)
输出:

140226208543200
140226208543200
True

这与课堂无关。这也适用于任何计划功能

def f(y,x=[]):
    x.append(y)
    return x

print(f(5)) #returns [5]
print(f(7)) #returns [5,7]
这是因为当函数编译到内存中时,python会创建一个列表,其中的指针被指定为函数“f”中变量“x”的默认值。当我们执行“x.append”时,我们告诉python为函数追加到内存中的默认列表中。要避免这种行为,您需要避免操纵默认值(google可变对象与不可变对象)


这与课堂无关。这也适用于任何计划功能

def f(y,x=[]):
    x.append(y)
    return x

print(f(5)) #returns [5]
print(f(7)) #returns [5,7]
这是因为当函数编译到内存中时,python会创建一个列表,其中的指针被指定为函数“f”中变量“x”的默认值。当我们执行“x.append”时,我们告诉python为函数追加到内存中的默认列表中。要避免这种行为,您需要避免操纵默认值(google可变对象与不可变对象)


你可以找到一个关于这种行为原因的很好的总结。@rhurwitz是的,这和回答你的问题是一样的吗?你可以找到一个关于这种行为原因的很好的总结。@rhurwitz是的,这和回答你的问题是一样的吗?