파이썬 에서이 구문을 사용하여 두 개의 변수 값이 바뀌는 것을 보았습니다.
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)
답변
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