2013-05-08 4 views
0

다음 기능을 고려하십시오.생성기에서의 게으른 평가

def myfunc(): 
    a=b=c=0 
    x='12' 
    a,b,c=(i for i in x) 
    return a,b,c 

이 함수는 다음을 예외로 throw합니다. ValueError : 압축을 풀려면 2 개 이상의 값이 필요합니다. 여기서 'x'변수에 사용 가능한 값을 왼쪽에있는 변수에 지정된 순서로 할당하려고합니다. 따라서 a = 1, b = 2, c = 3, 내가 무엇을하고 싶은지.

발전기에 대한 나의 이해를 개선하기 위해, 나는 내가 뭘 생각하는 UNPACK_SEQUENCE 예외를 던지고있는 기능을

>>> dis.dis(myfunc) 
    2   0 LOAD_CONST    1 (0) 
       3 DUP_TOP    
       4 STORE_FAST    0 (a) 
       7 DUP_TOP    
       8 STORE_FAST    1 (b) 
      11 STORE_FAST    2 (c) 

    3   14 LOAD_CONST    2 ('12') 
      17 STORE_FAST    3 (x) 

    4   20 LOAD_CONST    3 (<code object <genexpr> at 0x297b430, file "<stdin>", line 4>) 
      23 MAKE_FUNCTION   0 
      26 LOAD_FAST    3 (x) 
      29 GET_ITER    
      30 CALL_FUNCTION   1 
      33 UNPACK_SEQUENCE   3 
      36 STORE_FAST    0 (a) 
      39 STORE_FAST    1 (b) 
      42 STORE_FAST    2 (c) 

    5   45 LOAD_FAST    0 (a) 
      48 LOAD_FAST    1 (b) 
      51 LOAD_FAST    2 (c) 
      54 BUILD_TUPLE    3 
      57 RETURN_VALUE 

을 분해. UNPACK_SEQUENCE 전에 STORE_FAST 할 수 있습니까? 내 질문이 합리적이 되길 바랍니다.

+2

'x = '12 '' 아니요'123'' 아니요, 아니요, 오른쪽은 항상 먼저 평가됩니다 – jamylak

답변

2

압축 해제를 사용하여 세 가지 변수에 지정합니다. 의 포장을 풀려면이 오른쪽 순서로 반복됩니다. 발전기 식에만 값 문자열 '1''2'를 얻을 수 있지만, 왼손 측 이름리스트 3 이름을 가지기 때문에

UNPACK_SEQUENCE는 실제로, 예외를 발생한다.

발전기에는 문제가 없습니다. 이 튜플 할당에 대한 제한, explicitly documented이다 x 길이가 3이 아닌 경우

a, b, c = list(x) 

가 동일한 예외를 발생, 예를 들어 :리스트를 사용할 때 동일한 오류가 발생 될

  • If the target list is a comma-separated list of targets: The object must be an iterable with the same number of items as there are targets in the target list, and the items are assigned, from left to right, to the corresponding targets.

x = '123'

당신은 변수에 발전기 식을 할당 할 자유 : 당신은 발전기가 충분한 값을 제공하지 않기 때문에 c0로 설정 상태를 유지 할 것으로 예상하는 경우

>>> x = '12' 
>>> a = (i for i in x) 
>>> a 
<generator object <genexpr> at 0x105046dc0> 

, 그 다음은 어떻게하지입니다 튜플 할당이 작동합니다.

당신은 그것을 위해 기본값으로 도우미 기능을 사용할 수

def helper(a=0, b=0, c=0): 
    return a, b, c 

a, b, c = helper(*(i for i in x)) 

데모 :

>>> def helper(a=0, b=0, c=0): 
...  return a, b, c 
... 
>>> a, b, c = helper(*(i for i in x)) 
>>> a, b, c 
('1', '2', 0) 

기능은 모든 매개 변수에 대한 기본값을 사용하는 도우미 및 * 호출 구문에 발전기를 사용 이것을 위치 매개 변수로 취급하십시오.

+0

알았어요. 압축을 풀고 실제로 변수에 할당하는 방법이 있습니까? – sardok

+2

@sardok : 여기에 어떤 역할이 할당 될 것으로 예상됩니까? 왼쪽에 하나의 ** 이름으로 발전기를 할당 할 수 있지만 다른 두 이름에는 어떤 것을 할당해야합니까? –

+0

설명해 주셔서 감사합니다.나는 a, b, c = 1,2와 같은 것에 대한 답을 찾고 있음을 깨달았는데, 그 이유는 c의 값을 유지하면서 a와 b를 대입하는 것이 불가능한 것처럼 보였기 때문이다. – sardok

관련 문제