Python _u_init__;()错误行为?

Python _u_init__;()错误行为?,python,Python,我的代码吼叫遇到了一个奇怪的问题。我无法理解,为什么myClass的simplefied属性从上一轮中保持为“prepluted” 代码: 输出(为了更好地理解,我对行进行了编号) 第1行和第2行非常明显,这里没有魔力。我不明白为什么在第3行我收到了这样一个简单的\u字段值。正如我在代码中所看到的,我创建的类实例没有任何参数-m=myClass() 谢谢你的建议 Ydef打印带额外(lst=[]): 第一项附加(“额外”) 打印(lst) 用_extra([“apple”])#[“apple”,

我的代码吼叫遇到了一个奇怪的问题。我无法理解,为什么
myClass
simplefied
属性从上一轮中保持为“prepluted”

代码:

输出(为了更好地理解,我对行进行了编号)

第1行和第2行非常明显,这里没有魔力。我不明白为什么在第3行我收到了这样一个
简单的\u字段
值。正如我在代码中所看到的,我创建的类实例没有任何参数-
m=myClass()

谢谢你的建议

Y

def打印带额外(lst=[]):
第一项附加(“额外”)
打印(lst)
用_extra([“apple”])#[“apple”,“extra”]打印
用_extra()打印_#['extra']
使用_extra()打印(#['extra','extra']
Python中函数的默认参数在定义函数时计算一次

列表是可变的,
.append
将更改它所操作的实例

因此,
print\u with_extra
不创建新的空列表,而是重用一次初始化为空列表的单个默认值,并保留默认调用结果中的所有附加元素

同样的情况也发生在构造函数中。

def print_with_extra(lst=[]):
第一项附加(“额外”)
打印(lst)
用_extra([“apple”])#[“apple”,“extra”]打印
用_extra()打印_#['extra']
使用_extra()打印(#['extra','extra']
Python中函数的默认参数在定义函数时计算一次

列表是可变的,
.append
将更改它所操作的实例

因此,
print\u with_extra
不创建新的空列表,而是重用一次初始化为空列表的单个默认值,并保留默认调用结果中的所有附加元素


同样的情况也发生在构造函数中。

您正在使用可变类型(列表)作为标准值-它在定义函数时创建一次,并且在每次调用时都保持相同的实例。将其更改为
None
,并在函数体
中将其定义为
[]
,如果simple_字段为None

您正在使用可变类型(列表)作为标准值-它在定义函数时创建一次,并且在每次调用时保持相同的实例。如果simple_字段为None,则将其更改为
None
,并在函数体
中将其定义为
[]

class myClass:
    simpleField = []
    name = ''

    def __init__(self,simple_field=[]):
         self.simpleField = simple_field
         print('In __init__ %s ' % str(simple_field))


    def __str__(self):
        return self.name

    def __repr__(self):
        return self.name+' '.join(str(self.simpleField))

def fill(name='default'):
    m = myClass()
    m.name = name
    for i in range(0,5):
        m.simpleField.append(i)
    return m

if __name__ == '__main__':
    for i in range(0,2):
        m = fill('round '+str(i))
        print(m.__repr__())
1. In __init__ []
2. round 0[ 0 ,   1 ,   2 ,   3 ,   4 ]
3. In __init__ [0, 1, 2, 3, 4]
4. round 1[ 0 ,   1 ,   2 ,   3 ,   4 ,   0 ,   1 ,   2 ,   3 ,   4 ]