13

난 그냥이 질문에 대한 답을 읽어 Accessing class variables from a list comprehension in the class definition하나의 클래스 변수가 목록 이해에 정의되지 않고 또 다른 변수는 왜입니까?

을 그것은 NameError: name 'x' is not defined에 다음 코드 결과를 이유를 이해하라고하는 데 도움이 : x 목록에 대한 특별 범위에 정의되어 있지 않기 때문에

class A: 
    x = 1 
    data = [0, 1, 2, 3] 
    new_data = [i + x for i in data] 
    print(new_data) 

NameError가 발생 이해. 하지만 왜 다음 코드가 오류없이 작동하는지 이해할 수 없습니다.

class A: 
    x = 1 
    data = [0, 1, 2, 3] 
    new_data = [i for i in data] 
    print(new_data) 

출력이 [0, 1, 2, 3]입니다. 그러나 나는이 예 : NameError: name 'data' is not defined을 기대했기 때문에 이전 예제 에서처럼 x이라는 이름은 목록 이해 범위에 정의되어 있지 않습니다. 마찬가지로 data 이름도 목록 이해 범위에 정의되지 않았습니다.

x이 목록 이해 범위에 정의되어 있지 않지만 data이 맞는지 이해해 주시겠습니까?

답변

15

data은 목록 이해 중소스입니다. 그것은 생성 된 중첩 된 범위로 전달되는 하나의 매개 변수입니다.

목록 이해도의 모든 항목은 가장 왼쪽의 for 루프에 사용되는 반복 가능 문자를 제외하고는 기본적으로 별개의 범위로 실행됩니다 (기본적으로 함수로). 사용자는 바이트 코드에서 볼 수

>>> def foo(): 
...  return [i for i in data] 
... 
>>> dis.dis(foo) 
    2   0 LOAD_CONST    1 (<code object <listcomp> at 0x105390390, file "<stdin>", line 2>) 
       3 LOAD_CONST    2 ('foo.<locals>.<listcomp>') 
       6 MAKE_FUNCTION   0 
       9 LOAD_GLOBAL    0 (data) 
      12 GET_ITER 
      13 CALL_FUNCTION   1 (1 positional, 0 keyword pair) 
      16 RETURN_VALUE 

<listcomp> 코드 목적 함수처럼 불리며, iter(data)은 (CALL_FUNCTION가, 1 개 위치 인수로 GET_ITER 결과를 실행)를 인수로 전달된다.

<listcomp> 코드 개체가 하나 개의 인자를 찾는다 :

>>> dis.dis(foo.__code__.co_consts[1]) 
    2   0 BUILD_LIST    0 
       3 LOAD_FAST    0 (.0) 
     >> 6 FOR_ITER    12 (to 21) 
       9 STORE_FAST    1 (i) 
      12 LOAD_FAST    1 (i) 
      15 LIST_APPEND    2 
      18 JUMP_ABSOLUTE   6 
     >> 21 RETURN_VALUE 
LOAD_FAST

호가 전달 된 최초의 유일한 위치 인자를 말한다 이름을 부여하는 함수 정의가 없었기 때문에 여기서 이름을 지정하지 않습니다.

목록 이해 (또는 해당 문제에 대한 설정 또는 dict 이해 또는 생성자 표현)에 사용 된 추가 이름은 매개 변수가 아닌 지역 변수, 클로저 또는 전역 변수입니다.