혼자 공부하는 파이썬 개정판 55강 - 메모리 구조(2): global 키워드

แชร์
ฝัง
  • เผยแพร่เมื่อ 27 ต.ค. 2024

ความคิดเห็น • 35

  • @도리카카
    @도리카카 11 หลายเดือนก่อน +1

    선생님이 강의 중에 어....라는 말과 함께 이렇게 크게 웃으시는건 첨이네요 ㅋㅋ

  • @리진-s3m
    @리진-s3m 2 ปีที่แล้ว +5

    이런 게 있구나 하고 넘어가면 나중에 이게 그거였구나 뇌에 무늬가 생깁니다.
    작가님 강의마다 늘 감사드립니다.

  • @ilkimable
    @ilkimable ปีที่แล้ว +3

    파이썬 초보에서 헤어나오지 못한 나에게 한단계 실력을 업그레이드 시켜준 강의입니다.
    메모리 구조를 모르고 append함수로 자료를 축적하다가 마지막에 바뀐 값으로 축적한 모든 데이터가 바뀌는 어이없는 현상을 이 강의를 통해 이해 하였습니다.
    다시 들어봐도 명강의입니다.

  • @Leon-sj9us
    @Leon-sj9us 2 ปีที่แล้ว +1

    헷갈려서 지난강의 다시듣고 이번강의는 3번다시들었더니 완벽히 이해됬습니다. 고맙습니다 구판독자로부터... 아 파이썬 매일코딩 책도 샀는데
    파이썬 3.8부터 새로도입된 walrus(바다사자) 연산자 개념도 처음 알게됬어요

  • @youngb2555
    @youngb2555 11 หลายเดือนก่อน

    안녕하세요, 작가님
    a = 10
    b = [1, 2, 3, 4]
    def function():
    print(a)
    print(b)
    function()
    을 했을때 변수 a가 선언, 할당 전에 참조 되었다고 오류가 나올줄 알았는데

    10
    [1, 2, 3, 4]
    가 출력이 됩니다.
    제가 잘못 이해했을 때는
    전역 위치에 있는 변수를 함수 내부에서 사용하지 못한다고 이해했었는데
    함수 내부에서 변수 선언, 할당이 없으면 함수 스택에 그 변수가 생성이 안되고 그럼 그 이름의 가까운 변수를 찾기 때문에 전역 위치에 있는 변수가 출력 되는건가요?
    즉 전역 위치의 변수명 같은 변수가 함수 내부에서 선언, 할당 하지 않으면 함수 안에서도 전역 위치의 변수를 가져다가 쓸수 있다라고 이해하면 될까요?
    아니면 전역위치의 변수를 함수 안에서 사용 가능은 당연한거고, 함수 안에서의 수정이 전역에 영향을 주지 않는다는 말씀이 강의의 포인트인 건가요?
    잘못 이해한 부분이 있다면 설명 부탁드립니다.

    • @윤인성
      @윤인성  11 หลายเดือนก่อน +2

      함수 내부에서 함수 외부에 있는 변수가 가진 스택 값을 변경할 때 사용할 수 없어서, global 키워드를 붙여야 하는 것입니다.
      이외의 경우에는 지금 언급해주신 것처럼
      (1) 현재 함수 내부에서 이름이 있는지 찾음
      (2) 전역 위치에 이름이 있는지 찾음
      (3) 파이썬 기본 제공 코드에 이름이 있는지 찾음
      이라는 과정을 거치며 차근차근 올라가며 이름을 찾아 나갑니다.
      PS. 예를 들어 print() 함수를 쓰면
      (1) 현재 함수에 print 있는 지 찾음
      (2) 전역 위치에 print 있는지 찾음
      (3) 파이썬 기본 제공 코드에 print가 있으므로 이것을 찾음
      합니다.

  • @버증-m9t
    @버증-m9t 6 หลายเดือนก่อน

    5:08 궁금한게 있는데 선언되지 않은 변수를 출력해서 오류가 생기는거면 저 Unbound 에러 말고 다른 에러가 나야되는거 아닌가요? 351p책에는 외부에 있는 변수를 출력하고 외부에 있는 변수 값을 교체하게 되어서 오류가 나는거라고 되있는데 그럼 함수가 외부에 있는 변수를 활용하면 외부변수를 인지하게 되어 외부변수를 건들여서 Unbound 에러가 난다고 이해해도 되나요?

    • @윤인성
      @윤인성  5 หลายเดือนก่อน

      이게 현재 단계만으로는 설명이 불가능한데
      오류를 정확하게 이해하려면 컴파일러라는 과목을 조금 알아야 합니다.
      간단하게 설명해보면
      .
      (1) 함수를 호출하면 함수의 코드를 한 줄 한 줄 실행하기 전에
      함수 내부에서 사용되는 심볼(식별자)를 모두 기록해둡니다.
      (2) 현재 코드의 함수 내부에서 a와 b가 사용되었으므로
      심볼 테이블(식별자를 기록하는 표)에 a,b가 기록합니다.
      (3) 그런데 외부에도 a,b가 있으니
      파이썬은 global.a, global.b, function.a, function.b라는 형태로 변수를 구별해둡니다.
      (4) global 키워드를 사용하지 않았으므로
      파이썬은 "함수 내부의 a, b는 모두 function.a, function.b로 생각하자"라고 합니다.
      (5) 함수 내부에서 print(a), print(b)는 print(function.a), print(function.b)로 인식하는데
      아직 초기화가 안 되었으므로 오류가 발생합니다.

  • @걸음이느린아이-n5o
    @걸음이느린아이-n5o 2 ปีที่แล้ว

    올려주실때마다 빨리 빨리 들으면 좋겠지만,
    일을 하면서 하다보니 항상 듣기 전에 과거 강의를 한번 더 듣고 하니 도움이 되는 것 같습니다. 오늘도 감사합니다!

  • @우주-g3w
    @우주-g3w 3 หลายเดือนก่อน

    안녕하세요! 궁금한게 있어서 질문 남깁니다.
    a = 10
    b = [1,2,3,4]
    def function():
    print(a)
    print(b)
    function()
    이런경우 전역 변수를 참조해서 10과 [1,2,3,4]가 나오는데
    책의 피보나치 예제 부분에
    counter = 0
    def fibonacci(n):
    counter += 1
    if n == 1:
    return 1
    if n == 2:
    return 1
    else:
    fibonacci(n-1) + fibonacci(n-2)
    print(fibonacci(5))
    이 부분에 counter가 전역변수를 참조하는 것 아닌가요? 왜 오류가 나는지 궁금합니다!
    값을 변경 하는 것 때문인지 싶어서
    a = 10
    b = [1,2,3,4]
    def function():
    return a + 1
    function() 게 도 해봤는데 이건 오류가 안나오더라구요 ...

    • @윤인성
      @윤인성  3 หลายเดือนก่อน

      이게 조금 복잡한데 정확하게는 "외부 스택에 있는 변수의 값을 변경할 때"에 문제가 됩니다.
      관련된 내용은 다음 강의를 참고해보시면 좋을 것 같습니다!
      th-cam.com/video/9tbjjZb65ng/w-d-xo.html

  • @kkisu7173
    @kkisu7173 3 หลายเดือนก่อน

    0:50 주저할수밖에 없는 발언 ㅋㅋ... ㅜㅠ

  • @jaekunyoo8509
    @jaekunyoo8509 ปีที่แล้ว

    안녕하세요. 감사히 잘 봤어요.
    전체 영상 마치고 다시 반복해서 기억지속하려 해요.
    2023년 7월 16일 일 17시54분 태평양 시간

  • @DW-kb6ke
    @DW-kb6ke ปีที่แล้ว

    여기서 계속 막히는데요.
    parameter랑 argument 하다가 갑자기 스택,힙이 나오니 둘이 혼동되요.
    parameter랑 argument는 언제 쓰는거죠? 6:30 코드를 예로 들면 여기서는 매개변수랑 인자가 공백인데 그래도 되나요?
    제가 코드를 짜 봤는데
    e=[1,2,3]
    def object_change2(f):
    global e
    f=[4,5,6]
    print(e)
    object_change2(e)
    print(e)
    여기서 전 출력을 [1,2,3] [4,5,6]이 나오게 하고 싶은데 [1,2,3]만 두번 나와요.
    global e를 썼으니 전역 스택을 받아와서 고치는거 아닌가요? (솔직히 강의를 볼 때는 이해가 되는데 직접 해보니 이해가 안되요..)

    • @윤인성
      @윤인성  ปีที่แล้ว +1

      (1) 파라미터와 아규먼트 용어는 다음과 같습니다.
      def 함수(파라미터): # 호출 당할 때 값 받는게 파라미터
      pass
      함수(아규먼트) # 호출할 때 쓰는게 아규먼트
      (2) "변수랑 인자가 공백이다"라는 말은 무슨 의미인지 조금 더 자세하게 알 수 있을까요?
      (3) 현재 주신 코드에서는
      global e
      f=[4,5,6]
      로 f의 값을 변경하고 있으므로 e에는 어떠한 변경도 없습니다.
      지난 번에 질문 주신 시간으로 생각해보면
      현재 강의를 보면 너무 빨리 진행하고 계신 것 같은데
      함수 앞부분부터 차근차근 진행하시는 것을 추천드립니다.
      이 강의 전체는 대학교로 치면 1년 강의입니다.
      빨리빨리 진행하려기보다는
      느긋느긋하게 확실하게 진행하시는 것을 추천드립니다.
      추가적으로
      global e
      f=[4,5,6]
      와 같은 실수는 코드 자체를 많이 작성해보지 않아서
      발생하는 문제이므로
      알고리즘 문제 풀이를 진행하면서 강의를 보시는 것을 추천드립니다!
      [처음에는 스스로가 생각해도 어처구니 없는 이유로 오류가 발생하거나, 예상한대로 실행되지 않는데, 이를 몇 번 겪다보면 직접 상황 대처하실 수 있게 됩니다!]

    • @jaekunyoo8509
      @jaekunyoo8509 ปีที่แล้ว +1

      안녕하세요. 몇십년 동안 여러 개발언어 이름들만 듣다가 작년에 파이선으로 입문한 초보자에요.
      질문자께서 답변을 안하셔서 해결하셨는지 모르겠는데, 질문 읽으면서 함수 내에서 전역변수를 e로 지정하셔서 함수 전(위)의 e 변수값을 바꾸려면 같은 변수명으로 e = [ ] 하셨어야 원하시는 결과를 얻으실 수 있지요.
      선생님 답변 (3)에서 이유를 설명하셨듯이요.
      주제넘게 공부 방식에 대해서 더할게요. parameter argument stack hip 등은 관련 영상들 보셨다면 선생님께서 초보자도 이해할 만큼의 내용으로 충분히 알려주셨어요.
      위 질문은 이런 용어들을 모르셔도 충분히 아실 수 있는 내용이지요.
      저도 가끔 왜 저렇게 변하는지 이해가 안되는 경우에 자세히 보면, 명칭이던 용어던 과정이던 금방 듣고도 잊거나 비슷하던 많이 다르던 해당의 것이 아닌 다른 것으로 착각하고 결과나 다음 단계를 찾으니 안 맞는 경우가 대부분이었어요.
      선생님 누차 반복하시듯이 처음이니까 그렇겠지요.
      억지 예를 든다면 처음 만난 분 이름이 김철서 라고 했는데 김철수 라고 내맘대로 많이 듣던 이름으로 기억한다던지 이지요.
      이런 부분이 수학 공부에 걸림돌이 되어 수학 못하는 이과생이어서 좋아하는 이공학을 할 수가 없었어요. 이공학의 언어가 수학이니 불가능했지요.
      큰 걸림돌은 중고교 시절에는 공부는 해야겠는데 노는게 더 바쁘니 못했고, 어려서부터 뜯고발기고(기계 조작 분해 등)를 좋아해서 공학과를 가려했는데 점수가 낮아 물리학과에 갔는데 공부에 목적이 없으니 고교 수학을 제대로 해야지 학기초마다 결심을 해도 전자기기 전자회로에 빠져서 허송세월로 무늬만 졸업생이 됐어요.
      졸업후 저같은 부류는 이론이 확립돼야 하는 기술직이 아니라 실무 위주의 기능직으로 대학이 아니라 직업학교 등이 적합한 것을 알았지요.
      좋아하기에 더 깊이 알려고 해도 기본언어인 수학이 없어 여러 일들을 접할 때 책이나 문서들을 봐도 수식은 건너 뛰게 되어 도움은 되지만 제대로 알지 못하는 답답한 마음이 계속 됐어요.
      한심하게도 여러 얕은 기술로 지금까지 밥은 먹고 살었어요.
      어쩌다 자아비판까지 했네요. 100세 시대이니 시간 내서 수학 공부할 생각이에요.
      2023년 7월 9일 일 11시11분 태평양 시간

  • @DW-kb6ke
    @DW-kb6ke ปีที่แล้ว

    제가 346p 코드를 변형해서
    def primitive_change(b):
    b=20
    return b
    a=10
    print(a)
    primitive_change(a)
    print(a)
    이렇게 출력하면 10 10이 나오는데요. 스택 두개가 별개니 a=10 값이 두번 나오는건가요? 근데 함수 내에서 return b를 쓰면 6줄에서 a가 b로 바뀌어 20이 출력되는거 아닌가요?

    • @윤인성
      @윤인성  ปีที่แล้ว

      스택에 있는 변수의 이름이 바뀌거나 하는 일은 절대 없습니다 @_@

    • @DW-kb6ke
      @DW-kb6ke ปีที่แล้ว

      @@윤인성 저 그러면 여기서 10 20이 아니라 10 10이 나오는 이유가 뭔가요? return을 했으니 다시 함수 밖으로 나와야 하는거 아닌가요? 저번에 강의에서 main함수가 끝나면 그 값은 None으로 사라진다고 했는데 return을 쓸때도 그런가요? 전 return을 쓰면 밖으로 그 값이 나오는 줄 알았어요.

    • @윤인성
      @윤인성  ปีที่แล้ว

      리턴을 하면 "함수를 호출했던 위치"가 "리턴값"으로 대치됩니다.

      - c = primitive_change(a)이라 하면
      - c = 10으로 대치되는 것입니다.
      따로 변수로 받지 않으면 리턴값은 곧바로 증발합니다.
      이 내용은 10강 이전에 input() 함수를 다루면서 알아야 하는 내용입니다.
      현재 질문 3개가 연속으로
      변수에 대한 기본적인 이해가 부족한 것으로 보입니다.
      첫 강의부터 다시 차근차근 살펴보시는 것을 추천합니다.
      이전에도 언급했지만
      이 강의는 대학교에서 1학년 1년을 잡는 내용입니다.
      알고리즘 문제 풀이까지 그때그때 한다고 가정하면
      3학점으로 과제도 많고 시간을 많이 들여야 하는 내용입니다.
      빠르게 지나가려고 하지 마시고
      앞에서부터 다시 공부하시는 것을 추천드립니다.
      PS. 실제 컴퓨터 공학과에서도
      "기초 프로그래밍 언어"를 1년 잡고 진행해도
      70%의 학생이 진도를 따라가지 못해서
      거의 손 놓습니다[그리고 대학교 4년 자체가 그냥 버려집니다].
      그러니까 앞 강의부터 차근차근 확실하게 진행해주세요 @_@

  • @jaekunyoo8509
    @jaekunyoo8509 ปีที่แล้ว

    안녕하세요. 감사히 잘 봤어요.
    영역이 달라도 설정에 따라 영역 외에 영향을 미쳐서 값을 바꾸기도 하니 재미있기도, 신기하기도 하네요.
    2023년 7월 9일 일 9시57분 태평양 시간

  • @레쓰고디디씨
    @레쓰고디디씨 18 วันที่ผ่านมา

    완료

  • @djha1257
    @djha1257 11 หลายเดือนก่อน

    파이썬은 객체 지향 언어로 실제로는 문자, 숫자, 불 등이 모두 객체로 알고 있습니다. (그래서 문자열 뒤에 메서드 같은 걸 쓸 수 있는 것으로 알고 있습니다) 즉 파이썬은 기본자료형이 없고, 모두 객체로 모든것이 힙에 저장되었다가 스택의 주소를 통해 출력되는 것으로 알고 있는데요. 책에서 기본자료형과 객체자료형을 구분해서 설명해 주시니 혼돈이 옵니다. 설명해주시면 정말 감사하겠습니다.

    • @윤인성
      @윤인성  11 หลายเดือนก่อน +2

      대부분의 현대적인 객체 지향 프로그래밍 언어는 모든 자료형이 클래스로 구현되어 있지만
      실제로 활용할 때(복사와 함수 호출 때 등)의 동작이
      - C++ 이전 프로그래밍 언어의 "기본적인 형태로 동작한다"
      → 이걸 기본 자료형 또는 프리미티브스 라고 부릅니다.
      - C++ 이후 프로그래밍 언어의 "레퍼런스처럼 동작한다"
      → 이걸 객체 자료형 또는 복합 자료형이라 부릅니다.
      로서 동작이 달라 용어를 구분하게 됩니다.
      물리적인 저장 형태[실제 저장되는 형태]와
      논리적인 저장 형태[그걸 사용할 때 어떻게 인식해야 하는가]가 다르므로
      구분해서 생각해주세요!
      [컴파일러 제작자라면 둘 다 신경 써야하고 + 언어 사용자라면 논리적 형태만 생각하는 것이 편합니다]
      PS. 참고적으로, 사용할 때 "물리적인 저장 형태"를 생각하는 것이 조금 의미 없는 이유는
      이게 프로그래밍 언어 명세에 들어간 내용이 아니라
      구현체를 구현하는 사람과 방식에 따라서
      다 달라질 수 있기 때문입니다!
      [예를 들어 파이썬도 CPython(기본), PyPy, Cython 등의 구현체에 따라 메모리 활용 방식이 좀 다릅니다]
      PS. 사실 기본 자료형의 모든 것을 힙에 저장하는건 기본 연산을 느리게 만들므로[값 하나 뽑겠다고 스택힙 왔다갔다 계속 하기는 낭비]
      → 현대적인 구현에서 값 자체는 스택에 저장하는 편입니다[메서드 등은 힙에 올라감]

    • @djha1257
      @djha1257 10 หลายเดือนก่อน +1

      훌륭한 설명, 깊은 지식의 공유 감사드립니다. 혹시 장고나 플라스크 같이 프레임워크 강의도 만드실 생각은 없으신지요? 시중에 책과 동영상 강의가 있지만 책만 있거나, 동영상 강의만 있는 경우가 대부분입니다. 책은 전체구도를 이해하고 복습하는데 좋고, 동영상 강의는 빠르게 이해하는데 좋습니다. 혼공파는 이것을 모두 충족시킨 명강의였습니다. 뿐만 아니라 윤인성님처럼 원리를 깊이 이해하시는 분이 집필해주신다면 정말 감사할 것입니다. 시중 파이썬 웹 프레임워크는 대부분 이렇게 하면 이렇게 됩니다 짜잔~ 의 형태가 강해서 들어봐야 남는게 별로 없더군요. 특히 플라스크는 제대로 된 강의를 찾기 힘들었습니다

  • @DrowsyCAT
    @DrowsyCAT 2 ปีที่แล้ว

    .extend 처럼 global 변수 선언을 하지 않고도 함수 안에서 밖의 변수에 영향을 줄 수 있는 명령이 리스트 조작 함수 말고도 더 있나요?

    • @윤인성
      @윤인성  2 ปีที่แล้ว +1

      힙을 조작하는 모든 명령은 global 지정 없이 사용할 수 있습니다. 딕셔너리 조작, 리스트 조작 등등이요!
      ㅇㅇ.append()
      ㅇㅇ.sort()
      ㅇㅇ.pop()
      딕셔너리[""] = ""
      등등이요!

  • @성찬영-p4m
    @성찬영-p4m ปีที่แล้ว

    return value none이라고 하면 돌아갈값이 없다라고 이해 하면 될까요??

  • @doriang57
    @doriang57 2 ปีที่แล้ว +1

    global 없이 하면, 직접은 못 건드리지만,
    가공해서 사용한다는... 그렇게 이해하면 되는?
    그런 느낌적인 느낌 이네요. ^^
    확실히 그 당근 같은 미소에서 곧 다가올 채찍이 느껴지는 느낌이네요. ^^

    • @윤인성
      @윤인성  2 ปีที่แล้ว +1

      앗 우리 책 범위 내에서는 이제 이것보다 어려운 내용은 없습니다!! 이후에 수학, 알고리즘 등이 결합될 때 어려워집니다!

    • @doriang57
      @doriang57 2 ปีที่แล้ว

      @@윤인성 그것도 어렵습니다. ㅠㅠ
      나이들어가면서 C 덤볐다가 던지기를 수차례... (목적없는 그냥 배워볼까 했던 시절 ㅠㅠ) 선생님 덕분에 파이썬 수차례 완주했죠.
      그러다가 데이터 분석 넘어가니 와우~ 심해도 이런 심해가.... 4칙연산만 하면 죽을때까지 문제 없을 줄 알았던... 요즘 통계에 머리 싸메고 있습니다.
      혹시 통계관련 좀.. 쉽고 데이터분석쪽관련해서 다~~ 나온 사전 같은 책이 있을까요?
      한빛꺼 초급 중급 두 권 보고 있는데, 없는 내용들이 시험에 나오면 멘붕~ 초급책도 한 3번쯤 보니까 조금씩 보이는 것 같기는 한데... ㅠㅠ
      결론. 넋두리. 수학은 어렵다. 통계는 돌것 같다.
      영상 보면서 해보면 알 것 같은데 돌아서면 기억 안난다...아하하하하 ㅠㅠ

    • @윤인성
      @윤인성  2 ปีที่แล้ว +2

      통계 데이터분석의 범위가 너무너무 넓어서 ;ㅇ; ....
      한 권으로 정리해주는 사전 같은 책은 존재 자체가 힘들 것 같습니다 ;ㅇ; ....

    • @doriang57
      @doriang57 2 ปีที่แล้ว

      @@윤인성 감사합니다.
      한방에 정리된 책을 찾고 있었는데, 덕분에 한가지 깨달았네요 ^^

  • @JeongWooPark-iz3pb
    @JeongWooPark-iz3pb 2 หลายเดือนก่อน

    넘 재밌네요 ^^ 😙2024.08.27