Python 3에서 리스트 컴프리헨션은 자체 중첩 범위 내에서 작동하므로 클래스 정의 내에 정의된 클래스 변수에 직접 액세스할 수 없습니다. 이 동작은 이러한 액세스가 가능했던 Python 2와 다릅니다.
다음 코드는 Python 3의 문제를 보여줍니다.
class Foo: x = 5 y = [x for i in range(1)]
이 코드는 목록 이해가 클래스 변수에 액세스할 수 없기 때문에 x에 대한 NameError.
목록, 집합 및 사전 컴프리헨션과 생성기 표현식은 클래스 범위에서 상속되지 않는 중첩 범위에서 작동합니다. 이는 이러한 컴프리헨션이 함수로 구현되고 별도의 범위에서 실행되기 때문입니다.
제한에도 불구하고 컴프리헨션에서 클래스 변수에 액세스하는 해결 방법이 있습니다.
컴프리헨션에 필요한 변수를 보유하기 위해 클래스 정의 내에 특정 범위를 만듭니다.
class Foo: x = 5 def __init__(self): y = [self.x for i in range(1)]
대신 생성자에서 인스턴스 변수를 초기화하여 인스턴스 변수를 사용하세요.
class Foo: def __init__(self): self.x = 5 self.y = [self.x for i in range(1)]
가능하다면 변수와 논리를 클래스 정의 외부로 이동하고 전역 범위를 사용하세요.
x = 5 class Foo: y = [x for i in range(1)]
클래스 변수에 직접 액세스하는 동안 이해력으로는 불가능합니다. 가장 바깥쪽 반복 가능 항목에 대한 예외가 있습니다. 가장 바깥쪽 iterable을 결정하는 표현식은 클래스 변수에 액세스할 수 있습니다:
class Foo: x = 5 y = [i for i in range(x)]
위 내용은 Python 3 목록 이해가 클래스 변수에 직접 액세스할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!