在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返回的值。 (如果你只用一个参数调用popkey ,如果这个键不存在就会引发一个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需要两个参数。 前两个分配了selfkey的名字; 其余的都塞进一个名为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') >>>