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

zjm*_*126 83 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
Run Code Online (Sandbox Code Playgroud)

self.data.pop(key, *args) ←------为什么还有第二个参数?

Ale*_*lli 111

popdicts 的方法(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
Run Code Online (Sandbox Code Playgroud)

你会看到它有差别:第一pop删除'a'键,所以在第二popdefault居然是返回参数(因为'a'现在缺席b.data).

  • 只是一个小小的评论,我认为在某些情况下用户需要"弹出"`dict`元素但保留弹出元素的值是很重要的.因此,`dict.pop(key)`将`key`和相关的`value`一起删除,但也返回刚删除的`key`的`value`.我发现它很有用...... (3认同)

Jam*_*ley 27

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

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

第一个问题在Python标准库参考中得到了简单的回答:

pop(key [,default])

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


第二个问题在Python语言参考中有所介绍:

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

换句话说,该pop函数至少需要两个参数.前两个被分配名称selfkey; 其余的被塞进一个叫做的元组中args.

*args在调用中传递的下一行发生的是self.data.pop与此相反的 - 元组*args被扩展为传递的位置参数.这在Python语言参考中有解释:

如果语法*表达式出现在函数调用中,则表达式必须求值为序列.来自此序列的元素被视为它们是附加的位置参数

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

这给你灵活性; data恰好是dict正确的,因此self.data.pop()需要一个或两个参数; 但是如果你改成data了一个类型,它接受了19个参数来调用self.data.pop()你就不必改变类a了.您仍然必须更改任何调用a.pop()以传递所需的19个参数的代码.

  • +1 表示努力。我担心 OP 的英语无法完成阅读您的答案的任务。 (2认同)

Jam*_*ley 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'}
Run Code Online (Sandbox Code Playgroud)
>>> 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')
>>> 
Run Code Online (Sandbox Code Playgroud)


Set*_*eth 5

def func(*args): 
    pass
Run Code Online (Sandbox Code Playgroud)

当您以这种方式定义函数时,*args将传递给函数的参数数组.这允许您的函数在不事先知道将向其传递多少参数的情况下工作.

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

def func2(**kwargs): 
    pass
Run Code Online (Sandbox Code Playgroud)

请参阅:任意参数列表


在您的情况下,您已经定义了一个类似字典的类.该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
Run Code Online (Sandbox Code Playgroud)