객체를 담는 변수의 특징.
- 변수는 메모리 주소값을 가지고 있다.
- 메모리 효율성을 위해 파이썬 리스트는 메모리에 주소값만 저장하고, 직접 찾아가는 방식을 채택한다.
- 그렇기에 prac_result4의 주소값을 4번 가져간 prac_result5의 값도 전부 바뀐다.
- id() 함수 = 메모리 주소를 조회할 수 있는 내장함수이다.
- enumerate() 함수 = index값과 value 값을 unpacking 하여 꺼내올 수 있는 함수.
기존 리스트의 슬라이싱 된 값은 새로운 객체이다.(리스트를 복사하는 방식이다)
- 슬라이싱하여 가져오는 값은 (result6) 새롭게 객체를 만드는 방식임을 알 수 있다.
print("result4의 주소값:", id(prac_result4))
for i,v in enumerate(prac_result5):
print(i,"번째 주소값: ",id(v))
print("result5의 주소값",id(prac_result5))
prac_result6 = [prac_result4[:]for i in range(4)] # 슬라이싱은 주소값이 다르게 된다.
for i,v in enumerate(prac_result6):
print(i,"번째 주소값: ",id(v))
print("result6의 주소값",id(prac_reult6))
- 불변인 값들은 슬라이싱하여 복사해도 id가 같은 것을 볼 수 있다.
- 불변이기 때문에 요소가 동일하다면 deep copy해와도(재사용해도) 지장없기에 복사해 오는 로직인 듯. 튜플도 동일함.
x = "123123123"
y = x[:]
print(x is y)
print(x == y)
print(id(x),id(y))
#불변이 아닌 값들은 슬라이싱하여 복사할 경우 id가 다른 것을 볼 수 있다.
x = [range(10)]
y = [range(10)]
print(x is y)
print(x == y)
print(id(x),id(y),end="\\n\\n")
- 숫자의 경우는 낮은 숫자정도는 파이썬 내장으로 선언되어 있지 않을까 추측된다.
- 변수를 선언할때 일반적으로 숫자는 만들어서 할당해 주지만 낮은 숫자는 이미 내장되어 만들어져 있고, 그 주소를 받아오는
- 방식이 더 빠르기 떄문이지 않을까 라는 추측이 생긴다. (저장되어 있는 범위는 0~256인 듯하다)
x = 256
y = 256
print(x is y)
print(x == y)
print(id(x),id(y))
x = 1004
y = 1004
print(x is y)
print(x == y)
print(id(x),id(y))
time() 함수를 사용한 성능비교 방식
import time
curr = time.time()#여기서 반복문을 통해 연산을 하고~
last = time.time()
print(last-curr)
로 시간확인이 가능하다
N = int(input("순환할 숫자를 입력하세요:"))
for i in range(1,N+1):
for j in range(0,N):
if (j+i)//(N+1) >=1:
print((j+i)%(N+1)+1,end=" ")
else:
print((j+i)%(N+1),end=" ")
print()
리스트 복사 방식의 차이
1. shallow copy
- 새로운 복합 객체를 만들고, (가능한 범위까지( 원본 객체를 가리키는 참조를 새로운 복합 객체에 삽입합니다.
- 리스트 뒤에 copy() 함수 사용 - 주소값이 다르게 복사함(다른 객체로 새로 만들어 할당해 줌)
- 값은 같지만 주소값은 다르다~
- 슬라이싱으로 하는 복사도 여기에 속한다.
list_one = list(range(10))
list_second = list_one.copy()
print(list_one,list_second)
print(id(list_one),id(list_second))
list_i = [[0]]*3
print(list_i)
list_i[0][0] = 999 # 모든 값이 999로 바뀌는 것을 볼 수 있음
print(list_i)
슬라이싱은 shallow copy 라며?
- 바깥 리스트는 다른 주소를 가짐. 하지만 안쪽 리스트는 주소값을 그대로 가져와 같음
- copy() 함수를 써도 똑같이 적용됨.
- 원래 바깥만 복사하는 것을 shallow copy라고 함.
list_j = [[1,2],[3,4]]
list_k = list_j[:]
print(list_k[0] is list_j[0])
list_j[0][0] = 999
print(list_j,list_k)
2. deep copy
- import copy를 통해 라이브러리를 가져와야 한다.
- 새로운 복합 객체를 만들고, 재귀적으로 원본 객체의 사본을 새로 만들어 복합 객체에 삽입하는 방식을 말함.-
import copy
list_n = [[9,10],[11,12]]
list_o = copy.deepcopy(list_n)
print(list_n[0] is list_o[0]) # 안쪽까지 복사되었음을 알 수 있다.
list_n[0][0] = 100
print(list_n,list_o)
list comprehension 추가
- list_variable = [expression for 변수 in iterable if 조건식]
- for 횟수만큼 반복하되, 조건식이 참일 때만 expression을 실행하는 방식.
a = ['alpha','bravo','charlie','delta','echo','foxtrot','golf','hotel','india']
b = [i for i in a if len(i)==5]
print(b)
- 중첩된 list comprehension for 문
- [expression for 변수 in iterable for 변수 in iterable]
- 가독성을 위해 들여 쓰기를 해주는 것이 좋다.
lst = [[i,j,k] for i in range(4)
for j in range(4)
for k in range(4)]
print(lst)
'파이썬 > 파이썬 이론' 카테고리의 다른 글
8. Python_Class (1) | 2023.04.13 |
---|---|
7. Python_Function (1) | 2023.04.13 |
5. Python_Basic - 4 (0) | 2023.04.13 |
4.Python_Basic - 3 (0) | 2023.04.13 |
3.Python_Basic - 2 (0) | 2023.04.13 |