[python] 파이썬에서 두 변수를 바꾸는 표준화 된 방법이 있습니까?

파이썬 에서이 구문을 사용하여 두 개의 변수 값이 바뀌는 것을 보았습니다.

left, right = right, left

이것이 두 개의 변수 값을 교환하는 표준 방법으로 간주됩니까 아니면 두 변수가 일반적으로 가장 일반적으로 교환되는 다른 방법이 있습니까?



답변

파이썬은 왼쪽에서 오른쪽으로 식을 평가합니다. 과제를 평가하는 동안 오른쪽은 왼쪽보다 먼저 평가됩니다.

http://docs.python.org/3/reference/expressions.html#evaluation-order

이는 다음과 같은 표현을 의미합니다 a,b = b,a.

  • 오른쪽 b,a이 평가됩니다. 즉, 두 요소의 튜플이 메모리에 생성됩니다. 두 요소는 식별자로 지정된 객체 b이며 및 a프로그램 실행 중에 명령이 격려되기 전에 존재했습니다.
  • 이 튜플을 만든 직후 에이 튜플 객체를 할당하지 않았지만 중요하지 않습니다. 파이썬은 내부적으로 그것이 어디에 있는지 알고 있습니다
  • 그런 다음 왼쪽이 평가됩니다. 즉 튜플이 왼쪽에 할당되어 있습니다.
  • 좌측 두 개의 식별자로 구성되는 한, 튜플은 제 1 식별자가 해당 순서 풀고 a(공식적으로 약혼 된 목적하는 튜플의 첫 번째 요소에 할당 는 이름했기 때문에 스왑 전에 b)
    및 제 2 식별자는 b(이전에 있던 오브젝트 인 튜플의 두 번째 요소에 할당 그 식별자 때문에 스왑 전에 a)

이 메커니즘은 식별자에 할당 된 객체를 효과적으로 교체 a하고b

따라서 귀하의 질문에 대답하기 위해 : 예, 두 개의 식별자를 두 개의 객체로 바꾸는 표준 방법입니다.
그건 그렇고, 객체는 변수가 아니라 객체입니다.


답변

이것이 두 변수를 바꾸는 표준 방법입니다.


답변

변수를 바꾸는 세 가지 방법을 알고 있지만 a, b = b, a가장 간단합니다. 있다

XOR (정수)

x = x ^ y
y = y ^ x
x = x ^ y

간결하게

x ^= y
y ^= x
x ^= y

임시 변수

w = x
x = y
y = w
del w

튜플 스왑

x, y = y, x


답변

예기치 않은 오류가 발생하기 때문에 스왑하는 표준 방법이라고 말하고 싶지 않습니다.

nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]

nums[i]먼저 수정 된 다음 두 번째 변수에 영향을줍니다 nums[nums[i] - 1].


답변

여기에서 참조가 사용되므로 다차원 배열에는 작동하지 않습니다.

import numpy as np

# swaps
data = np.random.random(2)
print(data)
data[0], data[1] = data[1], data[0]
print(data)

# does not swap
data = np.random.random((2, 2))
print(data)
data[0], data[1] = data[1], data[0]
print(data)

Numpy 어레이의 스왑 슬라이스 참조


답변

eyquem 에서 설명한 문제를 해결 하기 위해 copy모듈을 사용하여 함수를 통해 값의 (역전 된) 사본을 포함하는 튜플을 반환 할 수 있습니다 .

from copy import copy

def swapper(x, y):
  return (copy(y), copy(x))

lambda: 와 같은 기능

swapper = lambda x, y: (copy(y), copy(x))

그런 다음 원하는 이름을 다음과 같이 지정하십시오.

x, y = swapper(y, x)

참고 : 원하는 경우 deepcopy대신 가져 오거나 사용할 수 있습니다 copy.


답변

튜플XOR 스왑을 결합 할 수 있습니다 : x, y = x ^ x ^ y, x ^ y ^ y

x, y = 10, 20

print('Before swapping: x = %s, y = %s '%(x,y))

x, y = x ^ x ^ y, x ^ y ^ y

print('After swapping: x = %s, y = %s '%(x,y))

또는

x, y = 10, 20

print('Before swapping: x = %s, y = %s '%(x,y))

print('After swapping: x = %s, y = %s '%(x ^ x ^ y, x ^ y ^ y))

람다 사용 :

x, y = 10, 20

print('Before swapping: x = %s, y = %s' % (x, y))

swapper = lambda x, y : ((x ^ x ^ y), (x ^ y ^ y))

print('After swapping: x = %s, y = %s ' % swapper(x, y))

산출:

Before swapping: x =  10 , y =  20
After swapping: x =  20 , y =  10