KR_Variable - somaz94/python-study GitHub Wiki

Python ๋ณ€์ˆ˜(Variable) ๊ฐœ๋… ์ •๋ฆฌ


1๏ธโƒฃ ๋ณ€์ˆ˜(Variable)๋ž€?

๋ณ€์ˆ˜๋Š” ๋ฐ์ดํ„ฐ(๊ฐ’)๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ์ด๋ฆ„์ด๋‹ค. ํŒŒ์ด์ฌ์—์„œ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์ž๋ฃŒํ˜•์„ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

# ๋ณ€์ˆ˜ ์ƒ์„ฑ๊ณผ ํ• ๋‹น
name = "John"           # ๋ฌธ์ž์—ด
age = 25               # ์ •์ˆ˜
height = 175.5         # ์‹ค์ˆ˜
numbers = [1, 2, 3]    # ๋ฆฌ์ŠคํŠธ

# ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ํ™•์ธ
print(id(name))        # ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ์ถœ๋ ฅ
print(type(name))      # ๋ณ€์ˆ˜์˜ ์ž๋ฃŒํ˜• ํ™•์ธ

โœ… ํŠน์ง•:

  • ์ž๋ฃŒํ˜•์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•˜์ง€ ์•Š์Œ
  • ๊ฐ’์ด ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ด
  • ๋™์  ํƒ€์ดํ•‘ ์ง€์› (ํƒ€์ž…์ด ์ž๋™์œผ๋กœ ๊ฒฐ์ •)


2๏ธโƒฃ ๋ณ€์ˆ˜ ํ• ๋‹น ๋ฐฉ๋ฒ•

# ๊ธฐ๋ณธ ํ• ๋‹น
x = 10

# ๋‹ค์ค‘ ํ• ๋‹น
a, b = 1, 2
x = y = z = 0

# ํŠœํ”Œ ํ• ๋‹น
coord = (3, 4)
x, y = coord

# ๋ฆฌ์ŠคํŠธ ํ• ๋‹น
[a, b] = [1, 2]

# ๊ฐ’ ๊ตํ™˜
a, b = b, a           # ๋‘ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๊ตํ™˜

# ๋ณ„ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ ํ• ๋‹น
first, *rest = [1, 2, 3, 4, 5]  # first = 1, rest = [2, 3, 4, 5]
*beginning, last = [1, 2, 3, 4] # beginning = [1, 2, 3], last = 4

โœ… ํ• ๋‹น ๋ฐฉ๋ฒ•:

  • ๋‹จ์ผ ๊ฐ’ ํ• ๋‹น
  • ๋‹ค์ค‘ ๊ฐ’ ๋™์‹œ ํ• ๋‹น
  • ํŠœํ”Œ/๋ฆฌ์ŠคํŠธ ์–ธํŒจํ‚น
  • ๊ฐ™์€ ๊ฐ’ ๋™์‹œ ํ• ๋‹น
  • ๋ณ„ ์—ฐ์‚ฐ์ž(*)๋ฅผ ์ด์šฉํ•œ ์ผ๋ถ€ ์š”์†Œ ํ• ๋‹น


3๏ธโƒฃ ๊ฐ์ฒด ์ฐธ์กฐ์™€ ๋ณต์‚ฌ

# ์ฐธ์กฐ
list1 = [1, 2, 3]
list2 = list1         # list2๋Š” list1๊ณผ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ

# ์–•์€ ๋ณต์‚ฌ (Shallow Copy)
list2 = list1[:]      # ์Šฌ๋ผ์ด์‹ฑ์„ ํ†ตํ•œ ๋ณต์‚ฌ
list2 = list1.copy()  # copy() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
list2 = list(list1)   # list() ํ•จ์ˆ˜ ์‚ฌ์šฉ

# ๊นŠ์€ ๋ณต์‚ฌ (Deep Copy)
import copy
list2 = copy.deepcopy(list1)

โœ… ๋ณต์‚ฌ ๋ฐฉ๋ฒ•:

  • ์ฐธ์กฐ: ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด
  • ์–•์€ ๋ณต์‚ฌ: ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ (์ค‘์ฒฉ ๊ฐ์ฒด๋Š” ์ฐธ์กฐ)
  • ๊นŠ์€ ๋ณต์‚ฌ: ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑ


4๏ธโƒฃ ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„(Scope)

# ์ „์—ญ ๋ณ€์ˆ˜
global_var = 100

def my_function():
    # ์ง€์—ญ ๋ณ€์ˆ˜
    local_var = 200
    print(local_var)
    
    # ์ „์—ญ ๋ณ€์ˆ˜ ์‚ฌ์šฉ
    global global_var
    global_var = 300

# ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ „์—ญ ๋ณ€์ˆ˜ ์ˆ˜์ •
x = 1
def change_global():
    global x
    x = 2
    
# ๋‚ด์žฅ ์Šค์ฝ”ํ”„
# ํ•จ์ˆ˜ ๋‚ด ํ•จ์ˆ˜์—์„œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜ ์ ‘๊ทผ
def outer():
    outer_var = "์™ธ๋ถ€ ๋ณ€์ˆ˜"
    
    def inner():
        nonlocal outer_var  # outer ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜ ์‚ฌ์šฉ
        outer_var = "๋ณ€๊ฒฝ๋œ ์™ธ๋ถ€ ๋ณ€์ˆ˜"
        
    inner()
    print(outer_var)  # "๋ณ€๊ฒฝ๋œ ์™ธ๋ถ€ ๋ณ€์ˆ˜" ์ถœ๋ ฅ

โœ… ๋ณ€์ˆ˜ ๋ฒ”์œ„:

  • ์ „์—ญ ๋ณ€์ˆ˜: ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ์ง€์—ญ ๋ณ€์ˆ˜: ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • global ํ‚ค์›Œ๋“œ: ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ „์—ญ ๋ณ€์ˆ˜ ์‚ฌ์šฉ
  • nonlocal ํ‚ค์›Œ๋“œ: ์ค‘์ฒฉ ํ•จ์ˆ˜์—์„œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜ ์‚ฌ์šฉ


5๏ธโƒฃ ๋ณ€์ˆ˜ ์ด๋ฆ„ ๊ทœ์น™

# ์˜ฌ๋ฐ”๋ฅธ ๋ณ€์ˆ˜๋ช…
name = "John"
user_age = 25
_private = "hidden"
camelCase = "style"
snake_case = "style"

# ์ž˜๋ชป๋œ ๋ณ€์ˆ˜๋ช…
# 2name = "John"     # ์ˆซ์ž๋กœ ์‹œ์ž‘ ๋ถˆ๊ฐ€
# my-name = "John"   # ํ•˜์ดํ”ˆ ์‚ฌ์šฉ ๋ถˆ๊ฐ€
# class = "Python"   # ์˜ˆ์•ฝ์–ด ์‚ฌ์šฉ ๋ถˆ๊ฐ€

โœ… ์ž‘๋ช… ๊ทœ์น™:

  • ๋ฌธ์ž, ์ˆซ์ž, ์–ธ๋”์Šค์ฝ”์–ด(_) ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ˆซ์ž๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†์Œ
  • ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„
  • ์˜ˆ์•ฝ์–ด ์‚ฌ์šฉ ๋ถˆ๊ฐ€
  • ์Šค๋„ค์ดํฌ ์ผ€์ด์Šค ๊ถŒ์žฅ (PEP 8)

โœ… ์˜ˆ์•ฝ์–ด ๋ชฉ๋ก:

# Python ์˜ˆ์•ฝ์–ด ํ™•์ธ
import keyword
print(keyword.kwlist)
['False', 'None', 'True', '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']


6๏ธโƒฃ ๋ถˆ๋ณ€ ๊ฐ์ฒด์™€ ๊ฐ€๋ณ€ ๊ฐ์ฒด

ํŒŒ์ด์ฌ์˜ ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋ฉฐ, ๊ฐ์ฒด๋Š” ๋ถˆ๋ณ€(immutable) ๋˜๋Š” ๊ฐ€๋ณ€(mutable)์œผ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.

# ๋ถˆ๋ณ€ ๊ฐ์ฒด (Immutable)
a = 10
print(id(a))
a = a + 1   # ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋จ
print(id(a))  # ๋‹ค๋ฅธ ID ์ถœ๋ ฅ

# ๊ฐ€๋ณ€ ๊ฐ์ฒด (Mutable)
my_list = [1, 2, 3]
print(id(my_list))
my_list.append(4)  # ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ์ˆ˜์ •๋จ
print(id(my_list))  # ๊ฐ™์€ ID ์ถœ๋ ฅ

โœ… ๊ฐ์ฒด ๋ถˆ๋ณ€์„ฑ:

  • ๋ถˆ๋ณ€ ๊ฐ์ฒด: ์ƒ์„ฑ ํ›„ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ (int, float, str, tuple, frozenset ๋“ฑ)
  • ๊ฐ€๋ณ€ ๊ฐ์ฒด: ์ƒ์„ฑ ํ›„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ (list, dict, set ๋“ฑ)
  • ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ƒˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋จ
  • ๊ฐ€๋ณ€ ๊ฐ์ฒด๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์œ ์ง€


7๏ธโƒฃ ๋ณ€์ˆ˜ ์‚ญ์ œํ•˜๊ธฐ

ํŒŒ์ด์ฌ์—์„œ๋Š” del ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

x = 10
print(x)  # 10 ์ถœ๋ ฅ

del x
# print(x)  # NameError: name 'x' is not defined

# ๋ฆฌ์ŠคํŠธ ์š”์†Œ ์‚ญ์ œ
my_list = [1, 2, 3, 4]
del my_list[1]  # ์ธ๋ฑ์Šค 1์˜ ์š”์†Œ ์‚ญ์ œ
print(my_list)  # [1, 3, 4] ์ถœ๋ ฅ

# ๋”•์…”๋„ˆ๋ฆฌ ์š”์†Œ ์‚ญ์ œ
my_dict = {'a': 1, 'b': 2}
del my_dict['a']  # ํ‚ค 'a'์™€ ๊ฐ’ ์‚ญ์ œ
print(my_dict)  # {'b': 2} ์ถœ๋ ฅ


8๏ธโƒฃ ํƒ€์ž… ํžŒํŠธ(Type Hints)

Python 3.5 ์ด์ƒ์—์„œ๋Š” ํƒ€์ž… ํžŒํŠธ๋ฅผ ํ†ตํ•ด ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ๋ณ€์ˆ˜ ํƒ€์ž… ํžŒํŠธ
name: str = "John"
age: int = 25
height: float = 175.5
is_active: bool = True

# ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฐ˜ํ™˜ ํƒ€์ž… ํžŒํŠธ
def greeting(name: str) -> str:
    return f"Hello, {name}!"

# ๋ณตํ•ฉ ํƒ€์ž… ํžŒํŠธ
from typing import List, Dict, Tuple, Optional, Union

# ๋ฆฌ์ŠคํŠธ ํƒ€์ž… ํžŒํŠธ
numbers: List[int] = [1, 2, 3]

# ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž… ํžŒํŠธ
user: Dict[str, Union[str, int]] = {
    "name": "John",
    "age": 25
}

# ํŠœํ”Œ ํƒ€์ž… ํžŒํŠธ
point: Tuple[int, int] = (10, 20)

# Optional ํƒ€์ž… ํžŒํŠธ(None์ด ๋  ์ˆ˜ ์žˆ์Œ)
maybe_name: Optional[str] = "John"
maybe_name = None  # ์œ ํšจํ•จ

โœ… ํƒ€์ž… ํžŒํŠธ ์‚ฌ์šฉ ์ด์ :

  • ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
  • IDE ์ž๋™ ์™„์„ฑ ๋ฐ ํƒ€์ž… ์ฒดํฌ ์ง€์›
  • mypy ๊ฐ™์€ ๋„๊ตฌ๋กœ ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ ๊ฐ€๋Šฅ
  • ๋Ÿฐํƒ€์ž„์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ (์ฃผ์„๊ณผ ์œ ์‚ฌ)


9๏ธโƒฃ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

ํŒŒ์ด์ฌ์€ ์ฐธ์กฐ ์นด์šดํŒ…๊ณผ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

import sys

# ๊ฐ์ฒด์˜ ์ฐธ์กฐ ์นด์šดํŠธ ํ™•์ธ
x = "Hello"
print(sys.getrefcount(x) - 1)  # ํ•จ์ˆ˜ ํ˜ธ์ถœ๋„ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ 1์„ ๋นผ์คŒ

# ์ž‘์€ ์ •์ˆ˜ ๊ฐ์ฒด ํ’€(interning)
a = 10
b = 10
print(a is b)  # True, ๊ฐ™์€ ๊ฐ์ฒด ์ฐธ์กฐ

# ํฐ ์ •์ˆ˜๋Š” ๋ณ„๋„ ๊ฐ์ฒด๋กœ ์ƒ์„ฑ
c = 1000000
d = 1000000
print(c is d)  # False, ๋‹ค๋ฅธ ๊ฐ์ฒด ์ฐธ์กฐ(Python ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ)

# ๋ฌธ์ž์—ด ์ธํ„ฐ๋‹
s1 = "hello"
s2 = "hello"
print(s1 is s2)  # True, ๊ฐ™์€ ๊ฐ์ฒด ์ฐธ์กฐ

# ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ง์ ‘ ํ˜ธ์ถœ(์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ž๋™์œผ๋กœ ์‹คํ–‰๋จ)
import gc
gc.collect()  # ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ

โœ… ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ํŠน์ง•:

  • ์ฐธ์กฐ ์นด์šดํŒ…: ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ ์ˆ˜๋ฅผ ์ถ”์ ํ•˜์—ฌ ์ฐธ์กฐ๊ฐ€ 0์ด ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜: ์ˆœํ™˜ ์ฐธ์กฐ ๋“ฑ ์ฐธ์กฐ ์นด์šดํŒ…์œผ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ
  • ๊ฐ์ฒด ํ’€๋ง: ์ž‘์€ ์ •์ˆ˜์™€ ์งง์€ ๋ฌธ์ž์—ด์€ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ ์œ„ํ•ด ์žฌ์‚ฌ์šฉ
  • ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”: ํŒŒ์ด์ฌ์€ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€๋งŒ, ํฐ ๋ฐ์ดํ„ฐ์…‹์„ ๋‹ค๋ฃฐ ๋•Œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์— ์ฃผ์˜ํ•ด์•ผ ํ•จ


โš ๏ธ **GitHub.com Fallback** โš ๏ธ