그냥 간략히만 설명하면 파이썬은 내부적으로 포인터를 사용해서 변수의 주소를 저장함. id 함수를통해 x = 1 y = x id(x) id(y)를 해보면 알 수 있음
뉴비봇(list0424)2020-06-05 05:32
답글
여기서 immutable 하고 mutable이 조금 나뉘어지는데 일단 immutable한 객체들은 대입연산을 하면 새로운 객체를 생성해서 그 객체를 다시 가리키도록 바뀜
뉴비봇(list0424)2020-06-05 05:33
답글
그러니까 그러면 위 콘솔짤에서 1) 상수를 저장할 때는 그 상수의 주소값이 전달되니까 spam eggs 값이 달라지고,
페르시아(xxcaesarpublicxx)2020-06-05 05:34
답글
근데 mutable 객체들중 리스트 같은 객체들이 append를 한다면 객체의 주소는 바뀌지 않고 동적할당하는것처럼 뒤에 추가가 됨
뉴비봇(list0424)2020-06-05 05:34
답글
2) 리스트를 직접 저장할 때도 그 주소값이 따로 전달되니 값이 달라지는데,
페르시아(xxcaesarpublicxx)2020-06-05 05:34
답글
3) 원본 리스트를 append하면 주소가 안 바뀌었으니 그 동일한 리스트를 계속 가리킨다 이거임?
페르시아(xxcaesarpublicxx)2020-06-05 05:35
답글
그래서 만약 append를 하기전에 eggs = spam 했다면 eggs는 spam의 내용을 복사하는것이 아닌 spam이 가리키는 주소를 복사해서 똑같은놈을 가리키고 있는중이기 때문에 append같은 객체를 생성하지않고, 주소도 바꾸지않는 함수를 실행하면 eggs도 똑같은 객체를 가리키기때문에 값이 바뀌는거임
뉴비봇(list0424)2020-06-05 05:36
답글
C로 따지자면 int a, int *b = &a, int *c = &a 에서 *b를 바꾸면 *c도 바뀌는것과 비슷한거
뉴비봇(list0424)2020-06-05 05:37
답글
그리고 니가 링크에 걸은 함수 인자에 mutable을 쓰면 왜 저런현상이 일어나는지는 함수에 bar = []를 한다고 해서 매 함수 실행할 때마다 리스트를 생성하는게 아님
뉴비봇(list0424)2020-06-05 05:40
답글
이전 글까지 포함해서 이제야 뭔가 이해되는 느낌임 ㄱㅅㄱㅅ
페르시아(xxcaesarpublicxx)2020-06-05 05:41
답글
최초 실행시에만 비어있는 리스트를 생성한 후에 이후에 만약 또 함수를 실행한다면 최초 실행시 생성했던 그 리스트가 연결이되는거임
뉴비봇(list0424)2020-06-05 05:41
답글
파이썬은 함수에 인자를 넘길 때 call by value나 call by reference 같은것이 아닌 call by assignment 라고 따로 명칭이 있는데 이는 어떤 객체를 인자로 쓰느냐에 따라 달라짐. 이건 너무간거같으니 구글링 해보고 ㅇㅇ
그걸 알려면 C로 작성된 파이썬의 변수 선언 부분을 봐야함
이게 혹시 그 파이썬은 모든게 오브젝트다 그거 때문임?
그냥 간략히만 설명하면 파이썬은 내부적으로 포인터를 사용해서 변수의 주소를 저장함. id 함수를통해 x = 1 y = x id(x) id(y)를 해보면 알 수 있음
여기서 immutable 하고 mutable이 조금 나뉘어지는데 일단 immutable한 객체들은 대입연산을 하면 새로운 객체를 생성해서 그 객체를 다시 가리키도록 바뀜
그러니까 그러면 위 콘솔짤에서 1) 상수를 저장할 때는 그 상수의 주소값이 전달되니까 spam eggs 값이 달라지고,
근데 mutable 객체들중 리스트 같은 객체들이 append를 한다면 객체의 주소는 바뀌지 않고 동적할당하는것처럼 뒤에 추가가 됨
2) 리스트를 직접 저장할 때도 그 주소값이 따로 전달되니 값이 달라지는데,
3) 원본 리스트를 append하면 주소가 안 바뀌었으니 그 동일한 리스트를 계속 가리킨다 이거임?
그래서 만약 append를 하기전에 eggs = spam 했다면 eggs는 spam의 내용을 복사하는것이 아닌 spam이 가리키는 주소를 복사해서 똑같은놈을 가리키고 있는중이기 때문에 append같은 객체를 생성하지않고, 주소도 바꾸지않는 함수를 실행하면 eggs도 똑같은 객체를 가리키기때문에 값이 바뀌는거임
C로 따지자면 int a, int *b = &a, int *c = &a 에서 *b를 바꾸면 *c도 바뀌는것과 비슷한거
그리고 니가 링크에 걸은 함수 인자에 mutable을 쓰면 왜 저런현상이 일어나는지는 함수에 bar = []를 한다고 해서 매 함수 실행할 때마다 리스트를 생성하는게 아님
이전 글까지 포함해서 이제야 뭔가 이해되는 느낌임 ㄱㅅㄱㅅ
최초 실행시에만 비어있는 리스트를 생성한 후에 이후에 만약 또 함수를 실행한다면 최초 실행시 생성했던 그 리스트가 연결이되는거임
파이썬은 함수에 인자를 넘길 때 call by value나 call by reference 같은것이 아닌 call by assignment 라고 따로 명칭이 있는데 이는 어떤 객체를 인자로 쓰느냐에 따라 달라짐. 이건 너무간거같으니 구글링 해보고 ㅇㅇ
Everything object - dc App