name & namespace

Name

  • name : identifier, variable, reference
  • object의 구분을 위해 사용

object

  • object는 value, type, 주소 의 3원소를 가지고 있다.

Ex)

1
2
3
4
5
a = 10
b = 0.12

print(a + b)

Memory에 저장된 형태

object(10, int, ref_cnt=1)0x100

= 100번째 저장된(주소) object는 10(value), int(type)의 속성을 갖는다.

** 하나의 object는 여러개의 이름(name or ref.)를 가질 수 있다.

** ref_cnt는 reference count를 의미한다.

name binding

- assignment
- import
- class 정의
- function 정의 ...

assignment

  • dictionary (key : value)
  • name binding (name : address)

객체(object)에 이름과 주소를 할당

이름 작성 규칙

  • 하나의 단어로 작성, 문자(한글), 숫자, _ 가능(띄워쓰기 불가능)
  • Keyword(+ 다른곳의 함수 이름)은 안쓰는 것이 좋고 쓰지만자
  • 숫자로 시작할 수 없으며, 대소문자 구분가능
  • _로 시작하는 이름은 class에서 쓰이므로 지양

name space

  • namespace는 이름 관리를 위한 dict container이다.
  • 모든 class, instance, fuction은 자신의 namespace를 가지고 있다.

built-in namespace

python에서 제공하는 함수, class, instance 등이 들어있는 곳.

Built-in Functions

global name space

내가 만든 함수, 인수, class들이 들어 있는 곳

1
2
3
4
5
a = 100
b = a
c = a
a = 101
print(a, b, c)

◎ namespace (global)

a : 0x100
b : 0x100
c : 0x100

◎ in memory

object(100, int ref_cnt=3) 0x100
object(101, int ref_cnt=1) 0x200

  • 그렇다면, 왜 ref_cnt 를 하는 것일까 ??
    • 사용되지 않는 객체를 삭제 하기 위해
    • 하나의 객체가 여러개의 이름을 가질 수있다.
    • 하지만, 하나의 이름은 하나의 객체만 가질 수 있다.

In

1
2
3
4
5
6
7
8
9
10
11
import sys

a= "Python"
b= a
c= a
a= "python"
print(f'a=[a], b=[b], c=[c]')

sys.getrefcount(a)
sys.getrefcount(b)
sys.getrefcount(c)

Out

a=[a], b=[b], c=[c]

4

5

5

키워드

pprint 안의 함수 pprint를 사용하여 키워드 리스트를 출력해 본다.

in

1
2
3
4
import keyword
import pprint as pp

pp.pprint(keyword.kwlist)

out

[‘False’,
‘None’,
‘True’,
‘_peg_parser_‘,
‘and’,
‘as’,
‘assert’,
‘async’,
‘await’,
‘break’,
‘class’,
‘continue’,
‘def’,
‘del’,
‘elif’,
‘else’,
‘except’,
‘finally’,
‘for’,
‘from’,
‘global’,
‘if’,
‘import’,
‘in’,
‘is’,
‘lambda’,
‘nonlocal’,
‘not’,
‘or’,
‘pass’,
‘raise’,
‘return’,
‘try’,
‘while’,
‘with’,
‘yield’]

assignment

  • assignment는 Expression이 아닌 statment이다.

    • Expression은 한개의 객체로 Evaluate될 수 있는것
    • 이름에 binding할 수 있다. (syntax에서 사용 할 수 있는 위치가 다르기 때문)
    • ver 3.8~ assignment expression (:=)이 추가되어 제공
  • assignment의 종류

    종류 기호 ex exp
    assignment = a = 10 10에 a 를 바인딩
    assignmented assignment **=, +=, -=, *=, //=, %=. <<=, >>=, &=, |=, ^=, @= a+= 10 a에 10을 더한 결과 객체에 a를 바인딩

덧셈의 ref_cnt

1
2
3
4
5
6
print("**********")
i = 10
print(id(i))
i += 1
print(id(i))
print("**********")

i가 10이때, i += 1 을 하면 11이라는 것이 만들어 진다.

이 11은 새로운 객체이다.

assignment_i

새로운 객체가 생성 되기 때문에 id가 달라진다. (memory의 adress)

pack & unPack

  • pack : (,) 콤마를 이용하여 Tuple 객체 하나 생성
  • unpack : 1개의 묶음에 있는 여러개의 객체 아이템이 분리되어 각각의 이름에 바인딩 됨.

이와 같은 pack과 unpack을 이용 하면, 여러 이름에 여러 값을 부여하기 쉽다.

in

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
data_int = 1
data_Tuple = 1,

data = 10, 20, 30
first, second, third = data
print(first, second, third)

def function():
a = 10
b = 20
print(locals())
del b
print(locals())

function()

Out

10 20 30


{‘a’: 10, ‘b’: 20}

{‘a’: 10}

  • del (변수) : python에 있는 좋은 기능
  • 변수를 삭제 할 수 있다.
  • locals() : local안에 있는 변수를 확인 할 수 있다.
  • type() : 변수의 data type을 확인 할 수 있다.

Ref. youtube, 1hr