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


92
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) ←------为什么还有第二个论点?


8
或者,如果您help(b.data.pop)对REPL 真的很懒。
Michael Mior 2012年

Answers:


120

pop字典的方法(例如self.data{'a':'aaa','b':'bbb','c':'ccc'}这里)有两个参数-请参阅文档

第二个参数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'键,因此第二个实际上返回popdefault参数(因为'a'现在不存在b.data)。


3
只是一小段简短的评论,我认为这在某些情况下非常重要,在这种情况下,用户需要pop使用元素,dict但保留弹出元素的值。因此,dict.pop(key)消除了key与关联在一起,value而且还返回valuekey是刚刚被拆除。我发现它很有用……
Flamenco

我期望@flamenco- pop()跨JavaScript,PHP,Java等更多语言的通用行为,尽管并非所有语言都可以这样做-例如C ++。
jave.web

27

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

  • pop(a,b)是做什么的?/为什么还有第二个参数?
  • 什么是*args被用来做什么?

第一个问题在Python标准库参考文献中得到了解答:

pop(key [,默认])

如果key在字典中,请删除它并返回其值,否则返回default。如果未提供默认值,并且字典中没有key,则会引发KeyError。


Python语言参考》涵盖了第二个问题:

如果存在形式“ * identifier”,则将其初始化为接收任何多余位置参数的元组,默认为空元组。如果存在形式“ ** identifier”,则将其初始化为新字典,该字典将接收任何多余的关键字参数,默认为新的空字典。

换句话说,该pop函数至少接受两个参数。前两个被赋予名称selfkey; 其余的填充到一个名为的元组中args

*args在调用中传递时,下一行发生的事情与之self.data.pop相反-元组*args扩展为传递的位置参数。《Python语言参考》对此进行了解释:

如果语法* expression出现在函数调用中,则表达式必须计算为序列。来自此序列的元素被视为它们是其他位置参数

简而言之,a.pop()要灵活并接受任意数量的位置参数,以便它可以将此未知数量的位置参数传递给self.data.pop()

这给了您灵活性。data恰好是dict现在,因此self.data.pop()需要一个或两个参数;但是,如果您将其更改data为需要调用19个参数的类型,则self.data.pop()根本无需更改类a。不过,您仍然必须更改任何调用a.pop()以传递必需的19个参数的代码。


2
+1的努力。我担心OP的英语不能胜任阅读答案的任务。
mechanical_meat 2010年

在写OPs个人资料之前,我曾写过这篇文章。我现在已经阅读了上述个人资料,并看到了其他一些OP问题。我刚刚做了另一次尝试,这次仅使用代码:)
James Polley 2010年

6
def func(*args): 
    pass

当您以这种方式定义函数时, *args会将参数数组传递给该函数。这使您的函数可以在不事先知道要传递多少个参数的情况下工作。

您也可以使用关键字参数来执行此操作**kwargs

def func2(**kwargs): 
    pass

另请:任意参数列表


在您的情况下,您已定义了一个类似于字典的类。该dict.pop方法定义为pop(key[, default])

您的方法不使用default参数。但是,通过使用定义方法*args并传递*argsdict.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

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')
>>> 

1
我读了几个问题,其他答案中有详细说明。我还阅读了OP的个人资料,意识到其他答案毫无用处。这个答案应该至少说明* args所做的部分工作,这是我猜测OP真正的困惑所在,尽管有这个问题。
詹姆斯·波利

@ James,+ 1表示您需要额外的努力。关于真正的问题,我也得出了相同的结论。
彼得·汉森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.