Codong's Development Diary RSS ํƒœ๊ทธ ๊ด€๋ฆฌ ๊ธ€์“ฐ๊ธฐ ๋ฐฉ๋ช…๋ก
2021-11-18 16:39:41

๐Ÿ™‹โ€โ™‚๏ธ ๊ฐœ์š”


ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณต๋ถ€๋ฅผ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด๋ฉด ์–•์€ ๋ณต์‚ฌ, ๊นŠ์€ ๋ณต์‚ฌ์— ๋Œ€ํ•ด ๋“ค์€ ์ ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋‚˜๋„ ๊ทธ๋žฌ์—ˆ๊ณ  ์–•์€ ๋ณต์‚ฌ๋Š” ์ฃผ์†Œ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ํ•˜๋‚˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ฐ™์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋Œ€๊ฐ• ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค. ์ด๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ๋งŽ์ด ๋ดค์—ˆ๋Š”๋ฐ, ๋‚˜๋Š” ์—ญ์‹œ ์ง์ ‘ ๊ฒช๊ธฐ ์ „๊นŒ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ž˜์„œ์ธ์ง€ ์—…๋ฌด ์ค‘์— ๊ธฐ์–ด์ฝ” ์ผ์„ ๋‚ด๊ณ  ๋ง์•˜๋‹ค.



๐Ÿšจ ์ƒํ™ฉ


์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š”๋ฐ ํ•„์š”์—†๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๊ฑธ๋Ÿฌ์ฃผ๊ธฐ ์œ„ํ•ด filter keyword ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์–ด์„œ ํ‚ค์›Œ๋“œ ํ•„ํ„ฐ๋ง์„ ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋‹จ์ˆœํžˆ ๊ฒ€์ƒ‰ ๋‹จ์–ด์— ๋”ฐ๋ผ ๋“ฑ๋กํ•ด๋‘” ํ•„ํ„ฐ๋งํ•  ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ณตํ†ต ํ•„ํ„ฐ๋งํ•  ํ‚ค์›Œ๋“œ์™€ ํ•ฉ์ณ์„œ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฑธ๋Ÿฌ์ฃผ๋Š” ๋กœ์ง์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฒ˜์Œ์—” ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ์— ํ•„ํ„ฐ๋ง ํ‚ค์›Œ๋“œ๊ฐ€ ์ง€์›Œ์ ธ์„œ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ–ˆ๋Š”๋ฐ, ๊ฐ€๋ฉด ๊ฐˆ์ˆ˜๋ก ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ์— ์ƒ๊ด€์—†์ด ๋“ฑ๋กํ•ด๋’€๋˜ ๋ชจ๋“  ํ‚ค์›Œ๋“œ๋กœ ํ•„ํ„ฐ๋ง์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฝ”๋“œ๋กœ ๋ณด๋ฉด ๋” ์ดํ•ด๊ฐ€ ๋น ๋ฅด๋‹ค.

FILTER_KEYWORD = {
    '๊ณตํ†ต' : {'ใ…‹', 'ใ…Ž', '.', '?'},
    '์ปคํ”ผ' : {'์Šคํƒ€๋ฒ…์Šค', 'ํ• ๋ฆฌ์Šค', '์ปคํ”ผ๋นˆ'},
}

def get_filter_keywords(search_key: Optional[str] = None) -> Set:
    filter_keywords = FILTER_KEYWORD['๊ณตํ†ต'] # {'ใ…‹', 'ใ…Ž', '.', '?'}
    if search_key:
        specific_filter_keywords = FILTER_KEYWORD[search_key] # {'์Šคํƒ€๋ฒ…์Šค', 'ํ• ๋ฆฌ์Šค', '์ปคํ”ผ๋นˆ'}
        filter_keywords |= specific_filter_keywords # ํ•ฉ์ง‘ํ•ฉ ์ทจํ•ด์คŒ.
    return filter_keywords 

if __name__ == "__main__":
    print(FILTER_KEYWORD['๊ณตํ†ต']) # {'ใ…‹', 'ใ…Ž', '.', '?'}
    get_filter_keywords('์ปคํ”ผ')
    print(FILTER_KEYWORD['๊ณตํ†ต']) # {'ใ…‹', 'ใ…Ž', '.', '?', '์Šคํƒ€๋ฒ…์Šค', 'ํ• ๋ฆฌ์Šค', '์ปคํ”ผ๋นˆ'}

FILTER_KEYWORD๋ฅผ ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๊ณ , ๋ชจ๋“  ๊ฒ€์ƒ‰์–ด์—๋„ ์ ์šฉ๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๊ณตํ†ต ํ•„ํ„ฐ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์ „์— ์ถ”๊ฐ€ํ•˜๊ณ , ์‚ฌ์ „์—์„œ ํŠน์ • ๊ฒ€์ƒ‰ ๋‹จ์–ด์˜ ํ•„ํ„ฐํ‚ค์›Œ๋“œ์™€ ํ•ฉ์ณ์„œ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋ฆฌํ„ด ๊ฐ’์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค. set์€ mutable ๊ฐ์ฒด๊ธฐ ๋•Œ๋ฌธ์—, ์œ„ ์˜ˆ์ œ์™€ ์ฒ˜๋Ÿผ FILTER_KEYWORD์˜ ๊ณตํ†ต set์„ ๋‹จ์ˆœ ๋Œ€์ž…ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์–•์€ ๋ณต์‚ฌ๋กœ๋Š” filter_keywords์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด FILTER_KEYWORD์˜ ๊ณตํ†ต set์˜ ๊ฐ’๋„ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋˜์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๋ถ€๋ถ„์€ ๋งˆ์ง€๋ง‰ print ๋ถ€๋ถ„์„ ๋ณด๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ณ€ํ•˜์ง€ ์•Š์•„์•ผ ํ•  FILTER_KEYWORD['๊ณตํ†ต'] ๊ฐ’์ด ๋ฐ”๋€Œ์–ด ๋ฒ„๋ฆฐ ๊ฒƒ์ด๋‹ค.๐Ÿ˜ฑ

โž• mutable, immutable / ์–•์€๋ณต์‚ฌ, ๊นŠ์€๋ณต์‚ฌ ๊ด€๋ จ ๊ธ€ : https://wikidocs.net/16038



๐Ÿ˜ฎโ€๐Ÿ’จ ํ•ด๊ฒฐ๋ฒ•


์ด๋Ÿฐ ์–•์€๋ณต์‚ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋ช‡ ๊ฐ€์ง€ ์žˆ๋‹ค.

  1. copy ๋ชจ๋“ˆ์˜ deepcopy ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
  2. mutable ๊ฐ์ฒด์˜ .copy() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
  3. list์˜ ๊ฒฝ์šฐ slicing ์‚ฌ์šฉ

๋‚˜๋Š” ์—ฌ๊ธฐ์„œ 2๋ฒˆ์ธ .copy() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด๊ฒฐํ–ˆ๋‹ค.


1๏ธโƒฃ .copy() method ์‚ฌ์šฉ

FILTER_KEYWORD = {
    '๊ณตํ†ต' : {'ใ…‹', 'ใ…Ž', '.', '?'},
    '์ปคํ”ผ' : {'์Šคํƒ€๋ฒ…์Šค', 'ํ• ๋ฆฌ์Šค', '์ปคํ”ผ๋นˆ'},
}

def get_filter_keywords(search_key: Optional[str] = None) -> Set:
    filter_keywords = FILTER_KEYWORD['๊ณตํ†ต'].copy() # copy method ์‚ฌ์šฉ
    if search_key:
        specific_filter_keywords = FILTER_KEYWORD[search_key] 
        filter_keywords |= specific_filter_keywords
    return filter_keywords 

if __name__ == "__main__":
    print(FILTER_KEYWORD['๊ณตํ†ต']) # {'ใ…‹', 'ใ…Ž', '.', '?'}
    get_filter_keywords('์ปคํ”ผ')
    print(FILTER_KEYWORD['๊ณตํ†ต']) # {'ใ…‹', 'ใ…Ž', '.', '?'}

์ด์ œ ์˜๋„ํ•œ ๋Œ€๋กœ ์ „์—ญ ๋ณ€์ˆ˜์ธ FILTER_KEYWORD์˜ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๊ฒŒ ๋˜์—ˆ๋‹ค!

๋‚ด๊ฐ€ ์ฒ˜ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ถฉ๋ถ„ํžˆ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์‚ฌ์‹ค ์ด ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ์™„๋ฒฝํ•˜๊ฒŒ ๋ณต์‚ฌ๋˜์ง€ ์•Š์„ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž

โž• mutable ๊ฐ์ฒด ์•ˆ์— ๋˜ mutable ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

a ๋ผ๋Š” ์ด์ค‘ ๋ฆฌ์ŠคํŠธ๋ฅผ b๋ผ๋Š” ๋ณ€์ˆ˜์— ๋ณต์‚ฌ๋ฅผ ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

>>> a = [[1,2],[2,3]]
>>> b = a.copy()
>>> print(a, b) # [[1, 2], [2, 3]] [[1, 2], [2, 3]]
>>> print(id(a), id(b)) # 140403959376304 140403959502640

.copy()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์‚ฌ๋ฅผ ํ•˜๋ฉด ์ฃผ์†Œ ๊ฐ’์ด ๋‹ค๋ฅธ ๊ฒƒ์„ ๋ณด์•„ ์ž˜ ๋ณต์‚ฌ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ํ•ญ์ƒ ์šฐ๋ฆฐ ์˜์‹ฌ์„ ํ•˜๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ด์•ผ์ง€ ์•Š๊ฒ ๋Š”๊ฐ€? ๋ฆฌ์ŠคํŠธ ์•ˆ์˜ ๋ฆฌ์ŠคํŠธ์˜ ์š”์†Œ๋ฅผ ๋ฐ”๊ฟ”๋ณด์ž.

>>> b[0][0]=2
>>> print(a, b) # [[2, 2], [2, 3]] [[2, 2], [2, 3]]

์•„๋‹ˆ ์ด๊ฒŒ ๋ญ๋žŒ? b ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฆฌ์ŠคํŠธ(b[0])์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’(b[0][0])์„ ๋ฐ”๊ฟ”๋ณด๋‹ˆ a ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ’๋„ ๊ฐ™์ด ๋ฐ”๋€Œ์–ด๋ฒ„๋ ธ๋‹ค. ๋ฌด์Šจ ์ผ์ผ๊นŒ? ํ˜น์‹œ ๋ชจ๋ฅด๋‹ˆ ๋‚ด๋ถ€ ๋ฆฌ์ŠคํŠธ์˜ ์ฃผ์†Œ ๊ฐ’์„ ์ฐ์–ด๋ณด์ž.

>>> print(id(a[0]), id(b[0])) # 140403959502480 140403959502480

๋‚ด๋ถ€์˜ ๋ฆฌ์ŠคํŠธ๋“ค์€ ์ฃผ์†Œ๊ฐ’์ด ์—ฌ์ „ํžˆ ๊ฐ™์€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ง์€ ๋‚ด๋ถ€ ๋ฆฌ์ŠคํŠธ๊นŒ์ง€๋Š” ๋ณต์‚ฌ(๋‹ค๋ฅธ ์ฃผ์†Œ ๊ฐ’์œผ๋กœ ํ• ๋‹น)๊ฐ€ ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ •๋ฆฌํ•˜๋ฉด, ๋”•์…”๋„ˆ๋ฆฌ๋‚˜ ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ๋‚ด๋ถ€ ์š”์†Œ์—๋„ ๋˜ list, set, dict๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒํ˜•๋“ค์€ .copy() ํ†ตํ•ด์„œ๋Š” ํ•˜์œ„์˜ ๋ฐ์ดํ„ฐ๊นŒ์ง€๋Š” ๋ณต์‚ฌ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. (list slicing์„ ์ด์šฉํ•œ ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•˜๋‹ค.)

๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋‚˜..? ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์ž!


2๏ธโƒฃ copy ๋ชจ๋“ˆ์˜ deepcopy method ์‚ฌ์šฉ

>>> import copy
>>> a= [[1,2],[2,3]]
>>> b = copy.deepcopy(a)
>>> print(a,b) # [[1, 2], [2, 3]] [[1, 2], [2, 3]]
>>> b[0][0]=2
>>> print(a,b) # [[1, 2], [2, 3]] [[2, 2], [2, 3]]
>>> print(id(a[0]), id(b[0])) # 140403959502240 140403958979392

deepcopy()๋ฅผ ์‚ฌ์šฉํ•˜๋‹ˆ b์˜ ๊ฐ’๋งŒ ๋ฐ”๋€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ , ํ•˜์œ„ ๋ฆฌ์ŠคํŠธ์˜ ์ฃผ์†Œ ๊ฐ’์„ ๋น„๊ตํ•ด๋ด๋„ ๋‹ฌ๋ผ์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด์ œ์•ผ ์ œ๋Œ€๋กœ ๊ฐ’๋งŒ ๋ณต์‚ฌ๋œ ๊ฒƒ์ด๋‹ค.

์˜ค๋Š˜์˜ ๊ตํ›ˆ : ๋ณ€ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ๋ณ€์ˆ˜๋Š” ๊ผญ!! immutable ๊ฐ์ฒด(tuple, frozenset ๋“ฑ)๋กœ ๋งŒ๋“ค์–ด์ฃผ์ž!!
๋‹ค๋ฅธ ๋ถ„๋“ค์€ ์ €์ฒ˜๋Ÿผ ์˜๋„ํ•˜์ง€ ์•Š์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ์ผ์ด ์—†๋„๋ก ๋ฐ”๋ž˜์š”...๐Ÿ˜ข



๐Ÿ‘‹ ๋งˆ๋ฌด๋ฆฌ


๋‚˜๋Š” ๋Œ€์ถฉ์ด๋ผ๋„ ์•Œ๊ณ ์žˆ๋˜ ๊ฐœ๋…์„ ์‹ค์ œ ์ƒํ™ฉ์—์„œ ๋งŒ๋‚˜๋ณด๋‹ˆ ์ „ํ˜€ ์‹ ๊ฒฝ ์“ฐ์ง€ ๋ชปํ•˜๊ณ , ๋Œ€์‘ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ์ด๊ฑฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ถ„๊ป˜์„œ ์—๋Ÿฌ ์žก์•„๋‚ด๋Š๋ผ ๋Šฆ๊ฒŒ ํ‡ด๊ทผํ•˜์…จ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ์žˆ์—ˆ๋‹ค๊ณ  ๋ง์”€ํ•ด์ฃผ์…จ์—ˆ๋‹ค... ์ง„์งœ ๋“ฃ๋Š” ์ˆœ๊ฐ„ ์ˆ˜์น˜ํ”Œ...๐Ÿ˜ต ๋‚ด๊ฐ€ ์ง  ์ฝ”๋“œ์—์„œ ๊ฒฐํ•จ์ด ๋ฐœ๊ฒฌ๋  ๋•Œ๊ฐ€ ์ œ์ผ ํ˜„ํƒ€ ์˜จ๋‹ค. ๋‚ด๊ฐ€ ์ด๊ฒƒ๋ฐ–์— ๋ชปํ•˜๋‚˜.. ์ด๋Ÿฐ ์ƒ๊ฐ์ด ๋“ค๋ฉด์„œ ๐Ÿ˜ญ

๊ทธ๋ž˜๋„ ๋‚˜๋ฅผ ์ƒ๊ฐํ•ด์„œ ๋งํ•˜์ง€๋ง๊นŒ ํ•˜์‹œ๋‹ค๊ฐ€ ์†”์งํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์‹  ๊ฒƒ์— ๊ฐ์‚ฌํ–ˆ๋‹ค. ๋•๋ถ„์— ๋‚ด๊ฐ€ ์ œ๋Œ€๋กœ ์•Œ๊ณ  ๋‹ค์Œ๋ถ€ํ„ฐ ๋”์šฑ ์‹ ๊ฒฝ ์จ์„œ ์ฝ”๋“œ๋ฅผ ์งœ์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค. ๊ทธ๋ž˜๋„ ์•ž์œผ๋กœ ์ด๋Ÿฐ ์ผ์ด ์ƒ๊ธฐ์ง€ ์•Š๋„๋ก ๋ฐฐ์šด ๋‚ด์šฉ๋“ค์„ ํ† ์ด ํ”„๋กœ์ ํŠธ์— ์ ์šฉ์‹œ์ผœ ๋ณด๋ฉด์„œ ์‹คํŒจ๋ฅผ ๊ฒช์–ด ๋ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๋ฐฐ์šด ๊ฒƒ์„ ์–•๊ฒŒ๋งŒ ์•Œ๊ณ  ์žˆ์ง€ ๋ง๊ณ  ๋‚ด ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋ ฅํ•˜์ž..๐Ÿ’ช