- dictionary와 작동방식이 거의 동일한데, defaultdict()는 인자로 주어진 객체(default-factory)의 기본값을 dictionary 값의 초기값으로 지정할 수 있음
외부함수이기 때문에 import
from collections import defaultdict
예시 1
A = [2,4,3,1,4,2]
A_dict = defaultdict(int)
for i in A:
A_dict[i] += 1 # 일반적인 dictionary와 다른 부분
# A에서 개수가 1개인 값 찾기 (3과 1)
for k, v in A_dict.items():
if v == 1:
print("unique")
defaultdict를 사용하지 않을 경우, 키가 있는지 확인하고 없으면 0으로 초기값 할당 후에 1을 더해야 함
화면의 폼에는 보이지 않지만(사용자는 볼 수 없음), 사용자가 입력을 마치면 폼과 함께 서버로 전송되는 요소
(예제)
히든 필드를 사용해 사용자가 사이트에서 로그인하는 정보를 서버로 넘겨줌
<input type = "hidden" value = "사이트를 통한 직접 로그인">
<label> 아이디: <input type = "text" id= "user_id"></label>
<label> 비밀번호: <input type = "password" id= "user_pw"></label>
<input type = "submit" value = "로그인">
실행하면 아래와 같이, hidden filed의 내용은 보이지 않는다.
하지만,, 위의 예제로는 도대체 hidden field를 왜 사용하는지 이해가 되지 않아서 찾아봤는데,,
위의 예제는 hidden field의 내용은 실제로 사용자의 눈에 보이지 않는다는걸 알려주기 위해 나온듯 하고
Hidden field에 대해 좀 더 정확히?자세히 말하면
사용자가 입력할 필요가 없는 정보/ 사용자가 몰라도 되는 정보,,이지만 폼 전송과 같이 전송해주어야 하는 정보를 담기 위한 것
어떤 블로그에서는 사용자가 변경해서는 안되는 데이터를 함께 보낼때 사용한다고 정의하였다
예를들면,, 회원가입 시 사용자의 아이피를 받는 경우 히든필드에 넣는 경우도 있고
또,,
어떤 정보를 수정하고자 할때, 데이터베이스 테이블에서 가지고 있는 Primary Key값을 hidden field에 같이 전송하면, 이 primary key값을 통해 DB에서 해당 레코드를 식별하여 업데이트를 쉽게 할 수 있다.
base commits위에 다른 499,500번째 commit을 만들어내고, 이 달라진 부분을 제출할 수 있음
Q. base는 항상 똑같은가?
A. No. 팀프로젝트가 혼자 하는 것이 아니기 때문에, 계속 바뀌게 된다.
Rebase란?
- base를 교체하는 방식
<git rebase vs merge>
기능에 집착하면 이 둘의 차이를 이해하기 어렵다..
"rebase이 왜 필요한지", "협업 과정"에 중점을 두고 이해할 것
혼자 local branch 상에서 rebase는 잘 쓰지 않음(거의 없음)
아래와 같은 사고 과정을 통해 이해해보면,,
같은 파일 내에서 다른 사람 것이 먼저 Merge가 되는 경우, 다른 사람의 commit 과 나의 commit이 충돌이 될 수 있음!
Q. 왜 충돌이 발생할까?
A. 같은 file을 건드렸기 때문에
Q. 충돌이 발생하지 않는다면, 왜 발생하지 않을까?
A. 다른 File을 건드려서
Q. 충돌이 발생할 확률이 높을까?
A. 발생할 확률이 낮음. 같이 협업을 하기 위해 폴더나 파일을 잘 나눈다는 등, 이미 설계가 잘 되어 있음. (이미 설계적으로 방지가 되어있음) 하나의 파일을 몇천명의 사람들이 수정해서 충돌이 발생하는 경우는 rebase의 할아버지가 나타나도 해결할수없음ㅋㅋ 잘 된 분업화, 모듈화, 등등 잘 쪼개놨기 때문에 충돌이 발생할 확률이 낮음
Q. 충돌이 발생하는 상황
A. Rebase 요청 -> 최신 역사로 베이스를 업데이트
<Rebase를 수행하는 과정>
fetch는 upstream에 있는 최신 commit들을 가져오는 것! 같이 협업하기 때문에, 다른 사람들의 작업을 가져오는 것은 항상 있는 일
즉, fetch는 rebase와 관련 X, 단순히 가져오는 역할!
1. pull = fetch +merge
(.git 폴더 히스토리 창고에다 넣어둔다)
2. git fetch upstream master
(내부 브랜치가 자동 생성됨 -> "upstream/master" )
3. git rebase upstream/master
Q. 이 명령어에서 문제가 생길 수 있을까?
A. "File이 같은지"가 중요!! 아래 빨간색과 보라색이 파일이 같을 경우, 충돌이 발생함
** base가 바뀌는 부분과 commit간의 충돌이 나는 부분을 구분해야함!
4. git push origin (branch 명) --f
Fork 부분을 갱신하는 작업
-f : force 옵션
force는 쓰지 말라는데, 왜 쓰면 안 되는 지가 중요!
공식 오픈소스 프로젝트에서는 base를 갱신한다던지, 중간 commit을 빼버린다던지, 등등 문제가 발생할 수 있기 때문에 "Force Push"를 잘 사용하지 않음
하지만, Fork한 프로젝트에서는 "Force Push" 사용 가능, Force Push는 달라진 점만 push하기 때문에 자주 사용