Python __init__参数问题

dam*_*ian 3 python identity equality class list

我很难理解类init的参数会发生什么,
例如:

class A(object):
    def __init__(self, argument=[]):  
        self.argument = argument[:]  
Run Code Online (Sandbox Code Playgroud)

要么:

def __init__(self,argument=None):  
    self.arguments = arguments or []  
Run Code Online (Sandbox Code Playgroud)

要么:

def __init__(self, argument=[]):  
    self.argument = argument  
Run Code Online (Sandbox Code Playgroud)

这是不可能的,因为每个A对象的默认值都指向同一块内存.我真的不明白这里发生了什么以及它是如何发生的.

Flá*_*iro 6

这是一个众所周知的python 陷阱.

基本上,该参数的默认值是在首次定义方法时创建的,并且因为它是一个可变对象(在本例中是一个列表),所以即使在更改后,它也只是引用同一个对象,甚至在后续调用中也是如此方法.

处理这类案件的通常方法是像第二个例子那样对待它:

def __init__(self, arguments=None):  
    self.arguments = arguments or []
Run Code Online (Sandbox Code Playgroud)

但是如果你想要做的是拥有一个包含所有参数的列表,你可以使用Python的参数解压缩.

它的工作原理如下:

def my_function(*args):
    print args
Run Code Online (Sandbox Code Playgroud)

然后,您将在您的方法中访问传递了所有参数的元组.所以如果你这样调用你的函数:

>>> my_function(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

您的输出看起来像:

(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

很酷的是,你总是可以用对开的方式使用它,所以,假设你有一个列表(或元组),并且你希望将列表中的每个项目作为函数的位置参数传递.你会这样做:

>>> my_list = [1, 2, 3]
>>> my_function(*my_list)
Run Code Online (Sandbox Code Playgroud)

而且,就您的功能而言,它与前一次调用相同.

您应该阅读我指出文档,以及更深入地定义函数的部分.