在Python中,dict.pop(a,b)是什么意思?

时间:2010-01-02 06:40:53

标签: python dictionary

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)←------为什么会有第二个参数?

4 个答案:

答案 0 :(得分:105)

pop dicts方法(如self.data,即{'a':'aaa','b':'bbb','c':'ccc'},此处)有两个参数 - 请参阅the docs

第二个参数defaultpop在第一个参数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)

这里有很多问题。我看到至少有两个,也许三个:

  • pop(a,b)做什么?/为什么会有第二个参数?
  • *args用于什么?

Python Standard Library参考文献中简单回答了第一个问题:

  

pop(键[,默认])

     

如果key在字典中,则将其删除并返回其值,否则返回default。   如果没有给出default并且key不在字典中,则引发KeyError。


第二个问题在Python Language Reference

中有所涉及
  

如果存在“*标识符”格式,   它被初始化为元组接收   任何多余的位置参数,   默认为空元组。如果   形式“**标识符”存在,它是   初始化为新词典   收到任何多余的关键字   参数,默认为新的空   字典。

换句话说,pop函数至少需要两个参数。前两个获得名称selfkey;其余的被塞进一个名为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

请参阅:Arbitrary argument lists


在您的情况下,您已经定义了一个类似字典的类。 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