문제

이 질문은 이미 여기에 답이 있습니다.

목록과 같은 컬렉션을 전달할 때 Python의 다른 기능으로 배열되면 사본을 만들거나 포인터일까요?

도움이 되었습니까?

해결책

파이썬 값별로 참조 대사를 전달합니다.

Python은 값 (Java와 같은)별로 참조 대사를 전달하며 Python의 모든 것은 객체입니다. 이것은 간단하게 들리지만 일부 데이터 유형은 통과 별 특성을 나타내는 것처럼 보이지만 다른 데이터 유형은 통과별로 행동하는 것처럼 보입니다. 거래는 무엇입니까?

변이 가능하고 불변의 대상을 이해하는 것이 중요합니다. 줄, 튜플 및 숫자와 같은 일부 물체는 불변입니다. 함수/메소드 내부에서 변경하면 새 인스턴스가 생성되며 함수/메소드 외부의 원래 인스턴스는 변경되지 않습니다. 목록 및 사전과 같은 다른 객체는 변동성이 있습니다. 즉, 객체를 어디에서 변경할 수 있습니다. 따라서 함수/메소드 내부의 객체를 변경하면 원래 객체를 외부로 변경합니다.

다른 팁

모든 참조/값 개념이 파이썬에 맞지 않는다는 것입니다. 파이썬은 변수의 "값"이 없습니다. 파이썬에는 객체를 지칭하는 객체와 이름 만 있습니다.

따라서 함수를 호출하고 괄호 안에 "이름"을 넣을 때 : 다음과 같습니다.

def func(x): # defines a function that takes an argument
    ... # do something here

func(myname) # calling the function

실제 대상 myname 포인팅은가 아니라 통과됩니다 이름 myname 그 자체. 함수 내부 다른 이름 (x)는 통과 된 것과 동일한 객체를 참조하도록 제공됩니다.

변이 가능하면 함수 내부의 객체를 수정할 수 있지만 외부 이름이 가리키는 것을 변경할 수 없습니다. 당신이 할 때 발생하는 것도 마찬가지입니다

anothername = myname

그러므로 나는 당신의 질문에 다음과 같이 대답 할 수 있습니다.

"통과 값"이지만 모든 값은 객체에 대한 참조 일뿐입니다.

여기서 답은 도움이되었지만, 내가 보지 못한이 미세한 차이를 보여줄 필요성을 발견했습니다.

  1. 불변의 객체만으로는 함수 호출 내에서 변경할 수 없습니다. (지금까지 대답은 그렇게 많이 말했습니다 ...)
  2. 그러나 변이 가능한 객체 안에 포함 된 불변의 객체는 메소드 호출 내에 다시 할당 될 수 있습니다.

'num'은 불변의 숫자 객체이기 때문에 여기에서 변경되지 않습니다 [지점 1 지원] : :

def incr_num(num):
    num += 1

num = 0

num
0

incr_num(num)

num
0

'목록 [0]'여기에 불변의 숫자 객체도 있습니다.

def incr_list(list):
    list[0] += 1

list = [0]

list[0]
0

incr_list(list)

list[0]
1

그렇다면 어떻게 불변의 숫자 객체 인 '목록 [0]'은 어떻게 변경되었고 (내 포인트 2를 뒷받침합니다.) 위의 예의 숫자 객체 'num'은 그렇지 않았습니까? 불변의 숫자 객체 '목록 [0]'은 Mutable List 객체 '목록'내에 포함되며 첫 번째 예제의 'num'은 컨티어가 아닌 숫자 객체입니다.

의도가 좋았지 만 느낍니다 @stephen pape 최고급 답변 (아래 인용)과 다른 유사한 답변은 완전히 정확하지 않았습니다 (그리고이 답변을 작성하도록 동기를 부여했습니다).

줄, 튜플 및 숫자와 같은 일부 물체는 불변입니다. 함수/메소드 내부에서 변경하면 새 인스턴스가 생성되며 함수/메소드 외부의 원래 인스턴스는 변경되지 않습니다.

위의 두 번째 코드 실험은 메소드 내에서 숫자 객체 ( 'list [0]')가 변경되고 있으며 함수 외부의 원래 인스턴스가 변경되었습니다.

참조가 전달되지만 매개 변수가 불변의 객체 인 경우 메소드 내에서 수정하면 새 인스턴스가 생성됩니다.

객체가 전달됩니다. 사본이 아니라 기본 물체에 대한 참조.

나는 또한 그것을 보는 것이 좋습니다 copy 기준 치수:

사본에 대한 파이썬 문서

근본적인 문제와 자신의 딥 카피를 수행하는 방법을 이해하는 데 도움이됩니다.

참조로 :

>>> x = [0,1,2,3]
>>> def foo(x_list):
    x_list[0] = 1


>>> foo(x)
>>> x
[1, 1, 2, 3]

겸손한 모범을 드리겠습니다

def swap(a, b):
    x = a
    print id(x)
    print id(a)
    print id(b)
    a = b

    print id(a)
    b = x
    print id(b)
    a[0]= '20'




var1 = ['1','2','3','4']
var2 = ['5','6','7','8','9']
print id(var1)
print id(var2)

swap(var1, var2)

print id(var1)
print id(var2)
print var1
print var2

다음 결과를 생성합니다

28329344 var1 28331264 var2 28329344 x 28329344 a 28331264 b 이후 b = b 28331264 a 후 b = x 28329344 b 이후 28329344 var1 28331264 var2 [ '1', '2', '3', '4', '6', '7', '8', '9']

메모리 주소에 매핑 28329344 28331264 var1 var2 ab x [0] = '20'[0] [0] = '20'후 [ '1', '2', '3', '4'] [ '20', '6', '7', '8', '9']

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top