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对象的默认值都指向同一块内存.我真的不明白这里发生了什么以及它是如何发生的.
基本上,该参数的默认值是在首次定义方法时创建的,并且因为它是一个可变对象(在本例中是一个列表),所以即使在更改后,它也只是引用同一个对象,甚至在后续调用中也是如此方法.
处理这类案件的通常方法是像第二个例子那样对待它:
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)
而且,就您的功能而言,它与前一次调用相同.