class a(object):
data={'a':'aaa','b':'bbb','c':'ccc'}
def pop(self, key, *args):
return self.data.pop(key, *args)#what is this mean.
b=a()
print b.pop('a',{'b':'bbb'})
print b.data
self.data.pop(key, *args)
←------为什么会有第二个参数?
答案 0 :(得分:105)
pop
dicts方法(如self.data
,即{'a':'aaa','b':'bbb','c':'ccc'}
,此处)有两个参数 - 请参阅the docs
第二个参数default
是pop
在第一个参数key
不存在时返回的内容。
(如果只用一个参数pop
来调用key
,如果该密钥不存在则会引发异常。)
在您的示例print b.pop('a',{'b':'bbb'})
中,这是无关紧要的,因为'a'
是b.data
中的密钥。但如果你重复这一行......:
b=a()
print b.pop('a',{'b':'bbb'})
print b.pop('a',{'b':'bbb'})
print b.data
你会发现它有所不同:第一个pop
删除了'a'
键,所以在第二个pop
中,default
参数实际上被返回了(因为{ {1}}现在缺少{1}}。
答案 1 :(得分:27)
这里有很多问题。我看到至少有两个,也许三个:
*args
用于什么?Python Standard Library参考文献中简单回答了第一个问题:
pop(键[,默认])
如果key在字典中,则将其删除并返回其值,否则返回default。 如果没有给出default并且key不在字典中,则引发KeyError。
第二个问题在Python Language Reference:
中有所涉及如果存在“*标识符”格式, 它被初始化为元组接收 任何多余的位置参数, 默认为空元组。如果 形式“**标识符”存在,它是 初始化为新词典 收到任何多余的关键字 参数,默认为新的空 字典。
换句话说,pop
函数至少需要两个参数。前两个获得名称self
和key
;其余的被塞进一个名为args
的元组中。
在*args
的调用中传递self.data.pop
时,下一行发生的事情与此相反 - 元组*args
扩展为传递的位置参数。这在Python Language Reference:
如果语法*表达式出现在 函数调用,表达式必须 评估一个序列。来自的元素 这个序列被视为好像它们一样 是额外的位置参数
简而言之,a.pop()
希望灵活并接受任意数量的位置参数,以便它可以将此未知数量的位置参数传递到self.data.pop()
。
这为您提供了灵活性; data
恰好是dict
,因此self.data.pop()
需要一个或两个参数;但是,如果您将data
更改为为self.data.pop()
调用了19个参数的类型,则根本不需要更改类a
。您仍然需要更改任何调用a.pop()
的代码来传递所需的19个参数。
答案 2 :(得分:6)
>>> def func(a, *args, **kwargs):
... print 'a %s, args %s, kwargs %s' % (a, args, kwargs)
...
>>> func('one', 'two', 'three', four='four', five='five')
a one, args ('two', 'three'), kwargs {'four': 'four', 'five': 'five'}
>>> def anotherfunct(beta, *args):
... print 'beta %s, args %s' % (beta, args)
...
>>> def func(a, *args, **kwargs):
... anotherfunct(a, *args)
...
>>> func('one', 'two', 'three', four='four', five='five')
beta one, args ('two', 'three')
>>>
答案 3 :(得分:5)
def func(*args):
pass
以这种方式定义函数时,*args
将是传递给函数的参数数组。这允许您的函数在不事先知道将向其传递多少参数的情况下工作。
使用**kwargs
:
def func2(**kwargs):
pass
在您的情况下,您已经定义了一个类似字典的类。 dict.pop
方法定义为pop(key[, default])
。
您的方法不使用default
参数。但是,通过使用*args
定义您的方法并将*args
传递给dict.pop()
,您允许调用者使用default
参数。
换句话说,您应该能够使用班级的pop
方法,例如dict.pop
:
my_a = a()
value1 = my_a.pop('key1') # throw an exception if key1 isn't in the dict
value2 = my_a.pop('key2', None) # return None if key2 isn't in the dict