파이썬에서 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

답변:


121

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

차이를 만드는 것을 볼 수 있습니다. 첫 번째 pop'a'키를 제거 하므로 두 번째 pop에서는 default인수가 실제로 반환됩니다 ( 'a'이제에는 b.data.


3
사용자가 pop요소가 필요 dict하지만 팝된 요소의 값을 유지 해야하는 상황에서 중요하다고 생각하는 작은 주석입니다 . 따라서 관련과 함께를 dict.pop(key)제거 하지만 방금 제거 된 의 를 반환합니다 . 나는 그것이 유용 ... 발견keyvaluevaluekey
플라멩코

@flamenco는 내가 기대하는 것입니다-JavaScript pop(), PHP, Java와 같은 더 많은 언어 에서 일반적인 동작이지만 모든 언어가 그렇게하는 것은 아닙니다 (예 : C ++).
jave.web

27

여기에 많은 질문이 있습니다. 나는 적어도 2 개, 아마도 3 개를 본다.

  • pop (a, b)는 무엇을합니까? / 두 번째 주장이있는 이유는 무엇입니까?
  • 무엇을 *args위해 사용됩니까?

첫 번째 질문은 Python 표준 라이브러리 참조 에서 간단하게 답변됩니다 .

pop (key [, 기본값])

키가 사전에 있으면 제거하고 해당 값을 반환하고 그렇지 않으면 기본값을 반환합니다. 기본값이 제공되지 않고 키가 사전에 없으면 KeyError가 발생합니다.


두 번째 질문은 Python Language Reference 에서 다룹니다 .

"* identifier"형식이 있으면 초과 위치 매개 변수를 수신하는 튜플로 초기화되며 기본값은 빈 튜플입니다. "** identifier"형식이 있으면 초과 키워드 인수를받는 새 사전으로 초기화되며 기본값은 새 빈 사전입니다.

즉, pop함수는 적어도 두 개의 인수를 사용합니다. 처음 두 사람은 이름 selfkey; 나머지는라는 튜플에 채워집니다 args.

*args에 대한 호출에서가 전달 될 때 다음 줄에서 일어나는 일은 self.data.pop이것의 반대입니다. 튜플 *args은 전달되는 위치 매개 변수로 확장됩니다. 이것은 Python Language Reference에 설명되어 있습니다 .

* expression 구문이 함수 호출에 나타나면 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

OPs 프로필을 읽기 전에 썼습니다. 나는 이제 프로필을 읽고 OP 질문 중 몇 가지를 보았습니다. 난 그냥 :)에만 코드를 사용하여 다른 시도,이 시간했습니다
제임스 Polley

7
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
다른 답변에 자세히 설명 된대로 몇 가지 질문을 읽었습니다. 나는 또한 OPs 프로필을 읽고 다른 대답이 쓸모 없다는 것을 깨달았습니다. 이 답변은 * args가 수행하는 작업의 적어도 일부를 보여 주어야합니다. 주제에도 불구하고 OP의 실제 혼란이 있다고 추측하는 것입니다.
James Polley

@James, 추가 노력에 +1. 나는 실제 질문에 대해 동일한 결론에 도달했습니다.
Peter Hansen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.