복붙노트

[PYTHON] 연결 할당은 어떻게 작동합니까?

PYTHON

연결 할당은 어떻게 작동합니까?

따옴표 :

>>> x = y = somefunction()

와 같다

>>> y = somefunction()
>>> x = y

질문 : Is

x = y = somefunction()

같은

x = somefunction()
y = somefunction()

?

내 이해를 기반으로, 어떤 함수는 정확히 하나의 값만 반환 할 수 있기 때문에 둘은 동일해야합니다.

해결법

  1. ==============================

    1.어떤 함수가 가변적 인 값을 반환하는 경우에도 동일하게 작동하지는 않습니다. 중히 여기다:

    어떤 함수가 가변적 인 값을 반환하는 경우에도 동일하게 작동하지는 않습니다. 중히 여기다:

    >>> def somefunction():
    ...     return []
    ... 
    >>> x = y = somefunction()
    >>> x.append(4)
    >>> x
    [4]
    >>> y
    [4]
    >>> x = somefunction(); y = somefunction()
    >>> x.append(3)
    >>> x
    [3]
    >>> y
    []
    
  2. ==============================

    2.둘 다.

    둘 다.

    x = y = some_function()
    

    ~에 해당합니다.

    temp = some_function()
    x = temp
    y = temp
    

    주문에 유의하십시오. 맨 왼쪽 대상이 먼저 지정됩니다. (C의 비슷한 표현식은 반대 순서로 할당 할 수 있습니다.) 파이썬 할당에 관한 문서에서 :

    해체는 이것을 보여준다 :

    >>> def chained_assignment():
    ...     x = y = some_function()
    ...
    >>> import dis
    >>> dis.dis(chained_assignment)
      2           0 LOAD_GLOBAL              0 (some_function)
                  3 CALL_FUNCTION            0
                  6 DUP_TOP
                  7 STORE_FAST               0 (x)
                 10 STORE_FAST               1 (y)
                 13 LOAD_CONST               0 (None)
                 16 RETURN_VALUE
    

    주의 : 동일한 대상이 항상 각 대상에 할당됩니다. 그래서 @Wilduck과 @andronikus가 지적했듯이, 당신은 아마 이것을 원하지 않을 것입니다.

    x = y = []   # Wrong.
    

    위의 경우 x와 y는 같은 목록을 참조합니다. 목록이 변경 가능하기 때문에 x에 추가하면 y에 영향을 미치는 것 같습니다.

    x = []   # Right.
    y = []
    

    이제 두 개의 별개의 빈 목록을 나타내는 두 개의 이름이 있습니다.

  3. ==============================

    3.somefunction ()이 호출 될 때마다 다른 값을 반환하면 어떨까요?

    somefunction ()이 호출 될 때마다 다른 값을 반환하면 어떨까요?

    import random
    
    x = random.random()
    y = random.random()
    
  4. ==============================

    4.에서

    에서

    x = somefunction()
    y = somefunction()
    

    어떤 함수는 한 번이 아니라 두 번 호출됩니다.

    매번 동일한 결과가 반환 되더라도 결과를 반환하는 데 분 단위가 걸리면 눈에 띄게됩니다! 또는 부작용이있는 경우. 사용자에게 암호를 묻습니다.

  5. ==============================

    5.예 :

    예 :

    def is_computer_on():
        return True
    
    x = y = is_computer_on()
    

    또는

    def get_that_constant():
        return some_immutable_global_constant
    

    결과는 같지만 결과를 얻는 프로세스는 다음과 같을 수 없습니다.

    def slow_is_computer_on():
        sleep(10)
        return True
    

    x와 y 변수의 내용은 같지만 x = y = slow_is_computer_on () 명령은 10 초 동안 지속되고 x = slow_is_computer_on (); y = slow_is_computer_on ()은 20 초 동안 지속됩니다.

    예 :

    def count_three(i):
        return (i+1, i+2, i+3)
    
    x = y = count_three(42)
    

    이전 섹션에서 설명한 것과 동일한 캐치가 적용됩니다.

    왜 내가 거의 말하는거야? 이것 때문에:

    x = y = count_three(42)
    x is y  # <- is True
    
    x = count_three(42)
    y = count_three(42)
    x is y  # <- is False
    

    좋아요, is를 사용하는 것은 이상한 일이지만, 이것은 반환이 동일하지 않다는 것을 보여줍니다. 이는 변경 가능한 경우에 중요합니다.

    이것은 또한이 질문에 대답되었습니다. 완전을 기하기 위해 다음과 같은 주장을 반복합니다.

    def mutable_count_three(i):
        return [i+1, i+2, i+3]
    
    x = y = mutable_count_three(i)
    

    이 시나리오에서 x와 y는 같은 객체이기 때문에 x.append (42)와 같은 연산을 수행하면 x와 y가 모두 4 개의 원소를 갖는리스트에 대한 참조를 보유한다는 것을 의미합니다.

    print를 부작용으로 생각해보십시오 (유효하지만 다른 예제가 대신 사용될 수 있음).

    def is_computer_on_with_side_effect():
        print "Hello world, I have been called!"
        return True
    
    x = y = is_computer_on_with_side_effect()  # One print
    
    # The following are *two* prints:
    x = is_computer_on_with_side_effect()
    y = is_computer_on_with_side_effect()
    

    인쇄물 대신에 더 복잡하거나 더 미묘한 부작용이있을 수 있지만 실제로는 한 번 또는 두 번 호출되며 다른 동작으로 이어질 수 있습니다.

    아마 간단한 임의의 방법 :

    def throw_dice():
        # This is a 2d6 throw:
        return random.randint(1,6) + random.randint(1,6)
    
    x = y = throw_dice()  # x and y will have the same value
    
    # The following may lead to different values:
    x = throw_dice()
    y = throw_dice()
    

    그러나 clock, global counters, system stuff 등과 관련된 것들은 입력이 주어지면 비 결정적이되는 것이 현명하며, 그러한 경우에는 x와 y의 값이 다를 수 있습니다.

  6. from https://stackoverflow.com/questions/7601823/how-do-chained-assignments-work by cc-by-sa and MIT license