Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何设置Python类属性而不实际设置?_Python - Fatal编程技术网

如何设置Python类属性而不实际设置?

如何设置Python类属性而不实际设置?,python,Python,有人能解释一下下面发生了什么吗?究竟为什么objectb具有objecta列表的值 class Test: def __init__(self, A = []): self.A = A def __str__(self): return str(self.A) def mutate_A(): a = Test() a.A.append(1) return a def problem_here(): a =

有人能解释一下下面发生了什么吗?究竟为什么object
b
具有object
a
列表的值

class Test:

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

    def __str__(self):
        return str(self.A)

def mutate_A():
    a = Test()
    a.A.append(1)

    return a

def problem_here():
    a = mutate_A()
    b = Test()

    print b  # why does this print [1] in python 2.7

problem_here()

如果我不清楚或者需要更多信息,请告诉我。谢谢。

因为在python中,默认参数只计算一次(定义函数时)。因此,该类的所有实例都使用相同的列表
A

但是,如果希望每个实例都有自己的列表,则应执行以下操作:

def __init__(self):
    self.A = []

>>> a = mutate_A()
>>> b = Test()
>>> print b
[]

出于这个原因,应该避免可变默认参数吗?您建议如何解决此问题?这不太正确。参数是在定义函数时计算的,而不是在第一次调用函数时计算的。@gjdanis,除非您特别想要该功能,否则您应该避免使用它。如何修复它?我更新了我的answer@IsmailBadawi哦,对不起,想到英语误译了。更新。Thanks@sshashank124:谢谢。这是相当惊人的。。。