Programing

* x, = lst 이해

lottogame 2020. 11. 8. 09:07
반응형

* 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

반응형