스택큐힙리스트

리스트 컴프리헨션은 이름을 컴프리헨션의 범위를 벗어나도 재할당합니다. 이게 맞는 건가요? 본문

카테고리 없음

리스트 컴프리헨션은 이름을 컴프리헨션의 범위를 벗어나도 재할당합니다. 이게 맞는 건가요?

스택큐힙리스트 2023. 11. 24. 21:18
반응형

Comprehensions는 범위와의 불통화와 함께 불규칙한 상호작용을 보여줍니다. 이것은 기대되는 동작인가요?


x = 원래 값
squares = [x**2 for x in range(5)]
print(x) # Python 2에서 4를 출력합니다!

징징대기 싫으면 이것은 오류의 잔인한 근원입니다. 새 코드를 작성할 때마다, 문제인 것을 알아도 가끔 매우 이상한 재할당으로 인한 오류를 발견합니다. 리스트 컴프리헨션에서는 항상 임시 변수를 밑줄과 함께 시작하는 것과 같은 규칙을 만들어야 할 필요가 있지만, 심지어도 그것만으로는 완벽하지 않습니다.
이 무작위한 타임바프가 기쁨이되고 싶은 사용의 용이성을 상쇄시키고 있습니다.

답변 1

리스트 컴프리헨션이 Python 2에서는 루프 제어 변수의 누수 현상이 발생하지만 Python 3에서는 그렇지 않습니다. Python의 창시자인 Guido van Rossum이 이에 대한 역사를 설명하고 있습니다.


우리는 또한 Python 3에서 또 다른 변경 사항을 만들었습니다. 리스트 축약과 제너레이터 표현 사이의 동등성을 개선하기 위해입니다. Python 2에서는 리스트 축약이 루프 제어 변수를 주위 범위로 누출합니다:


x = 'before'
a = [x for x in 1, 2, 3]
print x # 이것은 'before'가 아닌 '3'을 출력합니다.

이것은 리스트 축약의 초기 구현의 유물이었습니다. 이것은 Python의 더러운 작은 비밀 중 하나였습니다. 이것은 리스트 축약을 초보자에게는 흔한 함정은 아니었지만, 가끔 사람들을 아프게 했습니다. 제너레이터 표현에서는 이렇게 할 수 없습니다. 제너레이터 표현식은 별도의 실행 프레임이 필요한 제너레이터를 사용하여 구현됩니다. 따라서 제너레이터 표현식 (특히 짧은 시퀀스를 반복하는 경우)은 리스트 축약보다 효율적이지 않았습니다.


그러나 Python 3에서는 리스트 축약의 더러운 작은 비밀을 고치기로 결정했습니다. 제너레이터 표현식과 동일한 구현 전략을 사용합니다. 따라서 Python 3에서 위의 예제 (print(x)를 사용하여 수정한 후 :-)는 'before'를 출력하여 리스트 축약에서의 'x'가 일시적으로 가려지지만 주변 범위의 'x'를 무효화하지 않음을 증명합니다.


답변 2

리스트 컴프리헨션은 범위가 끝난 후에도 이름을 재할당합니다. 이것이 정확한지요? 이 주제에 대해 SEO에 입각한 한국어 에세이를 작성해 주세요.
리스트 컴프리헨션은 파이썬에서 강력한 기능 중 하나입니다. 이 기능은 한 줄로 리스트를 생성하는데 사용되는 간단하고 효율적인 방법입니다. 그러나 몇 가지 주의해야 할 사항이 있습니다. 그 중 하나는 리스트 컴프리헨션 범위의 끝이 지나도 변수 이름이 재할당된다는 점입니다.
일반적으로 변수는 해당 범위 내에서만 사용될 수 있습니다. 리스트 컴프리헨션에서 생성된 변수도 마찬가지입니다. 그러나 리스트 컴프리헨션 밖에서도 동일한 변수 이름을 사용하면 이전 변수가 재할당됩니다. 이는 의도하지 않은 결과를 초래할 수 있습니다. 예를 들어,
```python
numbers = [1, 2, 3, 4]
squared = [num**2 for num in numbers]
print(numbers)
```
위의 코드를 실행하면, numbers 리스트의 값이 그대로 출력됩니다. 하지만 아래와 같이 코드를 수정해보겠습니다.
```python
numbers = [1, 2, 3, 4]
squared = [num**2 for num in numbers]
num = 10
print(numbers)
```
이번에는 numbers 리스트의 값이 `[1, 2, 3, 4]`에서 `[10, 10, 10, 10]`로 바뀌어 출력됩니다. 이는 리스트 컴프리헨션에서 사용된 변수 num이 리스트 컴프리헨션 밖에서도 해당 변수 이름을 사용하여 재할당되었기 때문입니다.
이러한 현상은 프로그래머의 의도와는 다른 결과를 초래할 수 있으므로 주의해야 합니다. 리스트 컴프리헨션에서 변수의 범위를 구분하고자 한다면, 다른 변수 이름을 사용하거나 리스트 컴프리헨션 범위 내에서만 해당 변수를 사용하도록 해야 합니다.
결론적으로, 리스트 컴프리헨션은 변수 재할당과 범위에 대한 몇 가지 주의사항이 있습니다. 이를 명심하여 프로그래밍을 할 때 예기치 않은 결과를 방지할 수 있습니다.

반응형
Comments