파이썬 에서이 구문을 사용하여 두 개의 변수 값이 바뀌는 것을 보았습니다.
left, right = right, left
이것이 두 개의 변수 값을 교환하는 표준 방법으로 간주됩니까 아니면 두 변수가 일반적으로 가장 일반적으로 교환되는 다른 방법이 있습니까?
파이썬 에서이 구문을 사용하여 두 개의 변수 값이 바뀌는 것을 보았습니다.
left, right = right, left
이것이 두 개의 변수 값을 교환하는 표준 방법으로 간주됩니까 아니면 두 변수가 일반적으로 가장 일반적으로 교환되는 다른 방법이 있습니까?
답변:
파이썬은 왼쪽에서 오른쪽으로 식을 평가합니다. 과제를 평가하는 동안 오른쪽은 왼쪽보다 먼저 평가됩니다.
http://docs.python.org/3/reference/expressions.html#evaluation-order
이는 다음과 같은 표현을 의미합니다 a,b = b,a
.
b,a
이 평가됩니다. 즉, 두 요소의 튜플이 메모리에 생성됩니다. 두 요소는 식별자로 지정된 객체 b
이며 및 a
프로그램 실행 중에 명령이 격려되기 전에 존재했습니다.a
(공식적으로 약혼 된 목적하는 튜플의 첫 번째 요소에 할당 ㄴ 는 이름했기 때문에 스왑 전에 b
) b
(이전에 있던 오브젝트 인 튜플의 두 번째 요소에 할당 를 그 식별자 때문에 스왑 전에 a
)이 메커니즘은 식별자에 할당 된 객체를 효과적으로 교체 a
하고b
따라서 귀하의 질문에 대답하기 위해 : 예, 두 개의 식별자를 두 개의 객체로 바꾸는 표준 방법입니다.
그건 그렇고, 객체는 변수가 아니라 객체입니다.
a, b, c = c, a, b
.
변수를 바꾸는 세 가지 방법을 알고 있지만 a, b = b, a
가장 간단합니다. 있다
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
code
x = x + yy = xy x = xycode
예기치 않은 오류가 발생하기 때문에 스왑하는 표준 방법이라고 말하고 싶지 않습니다.
nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
nums[i]
먼저 수정 된 다음 두 번째 변수에 영향을줍니다 nums[nums[i] - 1]
.
var c=a
, a=b
, b=c
. 그리고 마지막 과제는 새로운 값을 사용하여 a
b의 주소를 평가합니다.
nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
. 문제를 해결할 것입니다.
nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
: 파이썬이 왼쪽 할당을 수행 할 때 문제가 변경되어 예기치 않은 변경 nums[i]
이 발생 nums[nums[i] - 1]
합니다. U는 처음에 원하는 U를 상상할 수 nums[1],nums[2] = nums[2],nums[1]
있지만 nums[1] = nums[2]
실행 후에 는 더 이상 가지고 있지 않으며 nums[2] = nums[1]
대신 U를 얻습니다 nums[888] = nums[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