* x, = lst 이해
나는 그것이 무엇을하는지 이해하기 위해 오래된 코드를 살펴보고 있는데, 다음과 같은 이상한 진술을 발견했습니다.
*x ,= p
p
이 맥락에서 목록입니다. 나는이 진술이 무엇을하는지 알아 내려고 노력 해왔다. 내가 알 수 x
있는 한, 값으로 설정 됩니다 p
. 예를 들면 :
p = [1,2]
*x ,= p
print(x)
그냥 준다
[1, 2]
그래서 이것은 다른 x = p
가요? 이 구문이 무엇을하는지 아십니까?
*x ,= p
기본적으로 확장 반복 가능한 압축 풀기 를 x = list(p)
사용 하는 난독 화 된 버전입니다 . 다음 쉼표 는 할당 대상을 튜플 (목록 일 수도 있음)로 만드는 데 필요합니다.x
*x, = p
인 상이 x = p
전자가 생성하기 때문에 복사 중 p
후자가 만드는 동안 (즉, 새로운 목록)을 참조하여 원래의리스트를. 설명하기 위해 :
>>> p = [1, 2]
>>> *x, = p
>>> x == p
True
>>> x is p
False
>>> x = p
>>> x == p
True
>>> x is p
True
Python 3.0 ( PEP 3132 ) 에 도입 된 기능입니다 . Python 2에서는 다음과 같이 할 수 있습니다.
>>> p = [1, 2, 3]
>>> q, r, s = p
>>> q
1
>>> r
2
>>> s
3
Python 3은 하나의 변수가 여러 값을 가질 수 있도록이를 확장했습니다.
>>> p = [1, 2, 3]
>>> q, *r = p
>>> q
1
>>> r
[2, 3]
따라서 이것은 여기에서 사용되는 것입니다. 그러나 세 개의 값을 보유하는 두 개의 변수 대신 목록의 각 값을 취하는 것은 하나의 변수 일뿐입니다. 이것은 다른 x = p
때문에 x = p
단지 수단 x
의 또 다른 이름입니다 p
. 그러나이 경우에는 동일한 값을 가진 새 목록입니다. ( "Least Astonishment"및 Mutable Default Argument에 관심이있을 수 있습니다. )
이 효과를 생성하는 다른 두 가지 일반적인 방법은 다음과 같습니다.
>>> x = list(p)
과
>>> x = p[:]
Python 3.3부터 목록 객체에는 실제로 복사를위한 메서드가 있습니다.
x = p.copy()
슬라이스는 실제로 매우 유사한 개념입니다. 그러나 nneonneo가 지적했듯이 슬라이스를 지원하는 목록 및 튜플과 같은 객체에서만 작동합니다. 그러나 언급 한 방법은 사전, 세트, 생성기 등 모든 반복 가능 항목에서 작동합니다.
당신은 항상 dis
이것을 던져서 그것이 당신에게 던져지는 것을보아야 합니다. *x, = p
실제로 다음과 어떻게 다른지 알 수 있습니다 x = p
.
dis('*x, = p')
1 0 LOAD_NAME 0 (p)
2 UNPACK_EX 0
4 STORE_NAME 1 (x)
반면에 간단한 대 입문 :
dis('x = p')
1 0 LOAD_NAME 0 (p)
2 STORE_NAME 1 (x)
(관련없는 None
반품 제거)
보시다시피 UNPACK_EX
이들 사이의 다른 op 코드입니다. 다음과 같이 문서화되어 있습니다 .
Implements assignment with a starred target: Unpacks an iterable in TOS (top of stack) into individual values, where the total number of values can be smaller than the number of items in the iterable: one of the new values will be a list of all leftover items.
Which is why, as Eugene noted, you get a new object that's referred to by the name x
and not a reference to an already existing object (as is the case with x = p
).
*x,
does seem very odd (the extra comma there and all) but it is required here. The left hand side must either be a tuple or a list and, due to the quirkiness of creating a single element tuple in Python, you need to use a trailing ,
:
i = 1, # one element tuple
If you like confusing people, you can always use the list
version of this:
[*x] = p
which does exactly the same thing but doesn't have that extra comma hanging around there.
참고URL : https://stackoverflow.com/questions/43190992/understanding-x-lst
'Programing' 카테고리의 다른 글
인터페이스의 TypeScript 선택적 기능 (0) | 2020.11.08 |
---|---|
Vue.js : 서비스 정의 (0) | 2020.11.08 |
axios로 인증 헤더를 보내는 방법 (0) | 2020.11.08 |
나노 편집기에서 X 행으로 이동 (0) | 2020.11.07 |
내 고유 애플리케이션 내에서 Google Maps iPhone 애플리케이션을 시작하려면 어떻게해야합니까? (0) | 2020.11.07 |