在Python中,dict.pop(a,b)是什么意思?
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)
←——为什么还有第二个参数?
dicts的pop
方法(如self.data
,即{'a':'aaa','b':'bbb','c':'ccc'}
,这里)有两个参数 – 请参阅文档
第二个参数default
是当第一个参数key
不存在的default
返回的值。 (如果你只用一个参数调用pop
, key
,如果这个键不存在就会引发一个exception)。
在你的例子中, 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
你会看到它b.data
:第一个pop
删除'a'
键,所以在第二pop
实际返回的default
参数(因为'a'
现在是从b.data
缺席)。
这里有很多问题。 我看到至less有两个,也许三个:
- pop(a,b)做了什么?/为什么还有第二个参数?
- 什么是
*args
被用于?
第一个问题在Python标准库参考中得到了简单的回答:
popup(键[,默认])
如果键在字典中,请将其除去并返回其值,否则返回默认值。 如果没有给出default并且key不在字典中,则引发KeyError。
第二个问题在Python语言参考中有介绍 :
如果表单“* identifier”存在,它将被初始化为一个元组,接收任何多余的位置参数,默认为空元组。 如果存在“**标识符”forms,则将其初始化为新的字典,接收任何多余的关键字参数,默认为新的空字典。
换句话说, pop
函数至less需要两个参数。 前两个分配了self
和key
的名字; 其余的都塞进一个名为args
的元组中。
当*args
传递给self.data.pop
时,下一行会发生什么?与此相反,元组*args
被扩展为传递的位置参数。 这在Python语言参考中进行了解释:
如果语法*expression式出现在函数调用中,则expression式必须计算为一个序列。 来自这个序列的元素被当作是附加的位置参数
简而言之, a.pop()
想要灵活并且接受任意数量的位置参数,以便它可以将这个未知数量的位置parameter passing给self.data.pop()
。
这给你灵活性; data
恰好是一个dict
,所以self.data.pop()
需要一个或两个参数; 但如果将data
更改为一个调用self.data.pop()
参数需要19个参数的types,则根本不需要更改class a
。 你仍然需要改变任何调用a.pop()
代码来传递所需的19个参数。
def func(*args): pass
当你这样定义一个函数时, *args
将是传递给函数的参数数组。 这允许你的函数在不知道提前知道的情况下工作多less个参数将被传递给它。
你也可以用关键字参数做这个,使用**kwargs
:
def func2(**kwargs): pass
请参阅: 任意参数列表
就你而言,你已经定义了一个类似字典的类。 dict.pop
方法定义为pop(key[, default])
。
您的方法不使用default
参数。 但是,通过用*args
和传递*args
来定义你的方法到dict.pop()
,你可以让调用者使用default
参数。
换句话说,你应该能够像dict.pop
一样使用你的类的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
>>> 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') >>>