카테고리 없음

파이썬 배열 주소값 할당

코테챌린져 2024. 1. 15. 01:11

https://leetcode.com/problems/remove-duplicates-from-sorted-array/

 

Remove Duplicates from Sorted Array - LeetCode

Can you solve this real interview question? Remove Duplicates from Sorted Array - Given an integer array nums sorted in non-decreasing order, remove the duplicates in-place [https://en.wikipedia.org/wiki/In-place_algorithm] such that each unique element ap

leetcode.com

 

class Solution:
  def removeDuplicates(self, nums):
    nums = [1,2,3]
    return len(nums)
   

a = Solution()
nums =[4,5,6,7]
number = a.removeDuplicates(nums)
print(nums)

 

위의 코드를 보자. 아직 class 사용법이 완전히 익숙하지 못해 이것저것 테스트 해보는 중의 중간단계이다. 

Solution class의 removeDuplicates라는 메서드는 nums라는 배열을 매개변수로 받아 [1,2,3]을 재할당하는 코드이다.

하지만 밑의 코드에서 nums를 출력해보면 여전히 값이 [4,5,6,7]로 유지된다.

그 이유는 무엇일까? 그 이유는 바로 c언어의 포인터 개념을 생각해보면 쉽다. 

nums = [1,2,3]은 새로운 주소에 새로운 배열을 만든것이지 기존 nums의 주소에 값들을 변경해준 것이 아니다.

그러면 어떻게 하면 위의 코드를 고칠 수 있을까?

class Solution:
  def removeDuplicates(self, nums):
    nums[:] = [1,2,3]
    return len(nums)
   

a = Solution()
nums =[4,5,6,7]
number = a.removeDuplicates(nums)
print(nums)

바로 nums[:]로 slice assignment를 해주면 된다.

아니면 nums.remove 후 nums.append를 하여도 좋고

for문으로 각 각의 배열의 index값을 일일이 바꿔도 좋다.

그치만, nums = [1,2,3] 처럼 새로운 배열을 만들면 안된다.

 

변수로 배열을 복사할때도 봐야한다.

b=[1,2,3]

 

a=b

는 a와 b가 같은 주소에 있는 배열을 가르키게 된다.

 

a=[]

a[:]=b

는 a가 다른 주소에 b와 같은 원소들을 가지게 된다. 

 

다음 예시를 보자.

a= [1,2]
b= [3,4,5]
 
print(hex(id(a)))
print(hex(id(b)))

 

각 각의 케이스의 결과를 직접 비교해봐라.

 

케이스 1)

c=a
print(a)
print(b)
print(c)
print(hex(id(c)))
c=b
print(a)
print(b)
print(c)
print(hex(id(c)))

 

케이스 2)

c=a
print(a)
print(b)
print(c)
print(hex(id(c)))
c[:]=b
print(a)
print(b)
print(c)
print(hex(id(c)))