在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)
,我们看到有一个第二个参数。你可能会问,为什么这里需要第二个参数呢?
简单来说,pop
这个方法是用来从一个集合里移除某个元素的。第一个参数key
就是你想移除的那个元素的标识。而第二个参数*args
其实是可选的,它可以让你在移除元素时提供一些额外的信息,比如如果这个元素不存在时,你希望返回什么值。这样做的好处是,你可以更灵活地处理不同的情况。
所以,第二个参数的存在是为了让这个方法更强大,能应对更多的场景。
4 个回答
def func(*args):
pass
当你这样定义一个函数时,*args
会变成一个数组,里面存放传给这个函数的所有参数。这意味着你的函数可以在不知道会有多少个参数被传入的情况下正常工作。
你也可以用关键字参数来做到这一点,使用**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
这里有很多问题。我看到至少有两个,可能还有三个:
- pop(a,b) 是干什么的?/为什么有第二个参数?
- *args 是用来干嘛的?
第一个问题在Python标准库的说明中可以简单找到答案:
pop(key[, default])
如果key在字典中,删除它并返回它的值;如果不在,则返回default。如果没有提供default,而key又不在字典中,就会抛出一个KeyError错误。
第二个问题在Python语言参考中有解释:
如果出现“*identifier”的形式,它会被初始化为一个元组,用来接收多余的位置参数,默认是一个空元组。如果出现“**identifier”的形式,它会被初始化为一个新的字典,用来接收多余的关键字参数,默认是一个新的空字典。
换句话说,pop
函数至少需要两个参数。前两个参数分别被命名为self
和key
;其余的参数会被放进一个叫args
的元组里。
当在调用self.data.pop
时传入*args
,实际上是将这个元组展开成位置参数传递出去。这在Python语言参考中有说明:
如果在函数调用中出现了*expression的语法,expression必须是一个序列。这个序列中的元素会被当作额外的位置参数处理。
简单来说,a.pop()
希望能够灵活地接受任意数量的位置参数,这样它就可以把这些不确定数量的位置参数传递给self.data.pop()
。
这给你带来了灵活性;目前data
是一个dict
,所以self.data.pop()
可以接受一个或两个参数;但如果你把data
改成一个需要19个参数的类型来调用self.data.pop()
,你就不需要改变类a
。不过,你仍然需要修改任何调用a.pop()
的代码,以传递所需的19个参数。
字典的 pop
方法(像 self.data
,也就是 {'a':'aaa','b':'bbb','c':'ccc'}
)需要两个参数——具体可以查看文档。
第二个参数 default
是当第一个参数 key
不存在时,pop
返回的值。
(如果你只给 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
参数实际上会被返回(因为这时 'a'
已经不在 b.data
中了)。