반응형
반응형

[python] 얕은 복사(shallow copy)와 깊은 복사(deep copy)

 

https://wikidocs.net/16038

 

12. 얕은 복사(shallow copy)와 깊은 복사(deep copy)

## 1. mutable과 immutable 객체 객체에는 mutable과 immutable 객체가 있습니다. ❈ 객체 구분 표 class 설명 구분 l…

wikidocs.net

 

1. mutable과 immutable 객체

객체에는 mutable과 immutable 객체가 있습니다.

❈ 객체 구분 표

class설명구분

list mutable 한 순서가 있는 객체 집합 mutable
set mutable 한 순서가 없는 고유한 객체 집합 mutable
dict key와 value가 맵핑된 객체, 순서 없음 mutable
bool 참,거짓 immutable
int 정수 immutable
float 실수 immutable
tuple immutable 한 순서가 있는 객체 집합 immutable
str 문자열 immutable
frozenset immutable한 set immutable

일반 user가 작성한 class도 대부분 mutable 한 객체 입니다.
immutable한 클래를 만들기 위해서는 특별한 방법이 필요합니다.

https://stackoverflow.com/questions/4828080/how-to-make-an-immutable-object-in-python

  • REPL에서 mutable과 immutable에서 구분해봅시다. 몇가지만 해봅니다.
  • list 는 mutable 입니다.
  • 변수 a 에 1, 2, 3을 원소로 가지는 리스트를 할당하였습니다.
  • id는 변수의 메모리 주소값을 리턴해줍니다.
  • a의 첫번째 원소를 변경한 후에도 id값은 변경없이 a의 변수가 변경되었습니다.
>>> a = [1, 2, 3]
>>> id(a)
4393788808
>>> a[0] = 5
>>> a
[5, 2, 3]
>>> id(a)
4393788808
  • set도 mutable입니다.
  • |= set에서 or 연산입니다. 합집합이 됩니다.
  • 값은 변경되었으나 id는 변함없습니다.
>>> x = {1, 2, 3}
>>> x
{1, 2, 3}
>>> id(x)
4396095304
>>> x|={4,5,6}
>>> x
{1, 2, 3, 4, 5, 6}
>>> id(x)
4396095304
  • str은 immutable 입니다.
  • s 변수에 첫번째 글자를 변경 시도하면 에러가 발생합니다.
  • s에 다른 값을 할당하면, id가 변경됩니다. 재할당은 애초에 변수를 다시할당하는 것이므로 mutable과 immutable과는 다른 문제입니다. list또한 값을 재할당하면 id가 변경됩니다.
>>> s= "abc"
>>> s
'abc'
>>> id(s)
4387454680
>>> s[0]
'a'
>>> s[0] = 's'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> s = 'def'
>>> s
'def'
>>> id(s)
4388970768

2. 변수 간 대입

2-1 mutable한 객체의 변수 간 대입

  • list의 얕은 복사를 확인 해봅니다.
  • b 에 a를 할당하면 값이 할당되는 것이 아니라 같은 메모리 주소를 바라봅니다.
  • b를 변경하면 같이 a도 바뀝니다.
  • mutable한 다른 객체 또한 똑같은 현상이 나타납니다.
>>> a = [1, 2, 3]
>>> b = a # shallow copy
>>> b[0]= 5
>>> a
[5, 2, 3]
>>> b
[5, 2, 3]
>>> id(a)
4396179528
>>> id(b)
4396179528

2-2 immutable한 객체의 변수간 대입

  • str 문자열의 얕은 복사를 확인해봅니다.
  • list와 똑같이 b를 a에 할당하면 같은 메모리 주소를 바라보게 됩니다.
  • 하지만 b에 다른 값을 할당하면 재할당이 이루어지며 메모리 주소가 변경됩니다.
  • 고로 a와 b는 다른 값을 가집니다.
>>> a = "abc"
>>> b = a
>>> a
'abc'
>>> b
'abc'
>>> id(a)
4387454680
>>> id(b)
4387454680
>>> b = "abcd"
>>> a
'abc'
>>> b
'abcd'
>>> id(a)
4387454680
>>> id(b)
4396456400

3. 얕은 복사(shallow copy)

  • list의 슬라이싱을 통한 새로운 값을 할당해봅니다.
  • 아래의 결과와 같이 슬라이싱을 통해서 값을 할당하면 새로운 id가 부여되며, 서로 영향을 받지 않습니다.
>>> a = [1,2,3]
>>> b = a[:]
>>> id(a)
4396179528
>>> id(b)
4393788808
>>> a == b
True
>>> a is b
False
>>> b[0] = 5
>>> a
[1, 2, 3]
>>> b
[5, 2, 3]
  • 하지만, 이러한 슬라이싱 또한 얕은 복사에 해당합니다.
  • 리스트안에 리스트 mutable객체 안에 mutable객체인 경우 문제가 됩니다.
  • id(a) 값과 id(b) 값은 다르게 되었지만, 그 내부의 객체 id(a[0])과 id(b[0])은 같은 주소를 바라보고 있습니다.
>>> a = [[1,2], [3,4]]
>>> b = a[:]
>>> id(a)
4395624328
>>> id(b)
4396179592
>>> id(a[0])
4396116040
>>> id(b[0])
4396116040
  • 재할당하는 경우는 문제가 없습니다. 메모리 주소도 변경되었습니다.
>>> a[0] = [8,9]
>>> a
[[8, 9], [3, 4]]
>>> b
[[1, 2], [3, 4]]
>>> id(a[0])
4393788808
>>> id(b[0])
4396116040
  • 하지만, a[1] 에 값을 변경하면 b[1]도 따라 변경됩니다.
>>> a[1].append(5)
>>> a
[[8, 9], [3, 4, 5]]
>>> b
[[1, 2], [3, 4, 5]]
>>> id(a[1])
4396389896
>>> id(b[1])
4396389896
  • copy 모듈의 copy 메소드 또한 얕은 복사입니다.
>>> import copy
>>> a = [[1,2],[3,4]]
>>> b = copy.copy(a)
>>> a[1].append(5)
>>> a
[[1, 2], [3, 4, 5]]
>>> b
[[1, 2], [3, 4, 5]]

4. 깊은 복사(deep copy)

  • 깊은 복사는 내부에 객체들까지 모두 새롭게 copy 되는 것입니다.
  • copy.deepcopy메소드가 해결해줍니다.
>>> import copy
>>> a = [[1,2],[3,4]]
>>> b = copy.deepcopy(a)
>>> a[1].append(5)
>>> a
[[1, 2], [3, 4, 5]]
>>> b
[[1, 2], [3, 4]]




https://suwoni-codelab.com/python%20%EA%B8%B0%EB%B3%B8/2018/03/02/Python-Basic-copy/

 

반응형
반응형

https://www.facebook.com/pyconkorea/

 

로그인 또는 가입하여 보기

Facebook에서 게시물, 사진 등을 확인하세요.

www.facebook.com

 

[python] 파이콘 2024  - https://2024.pycon.kr/

파이썬 코리아! 2024 이벤트 공지
파이토닉의 순간!
2024년 10월 25~27일 - 수원컨벤션센터
파이썬 사용의 크고 작은 순간을 함께 나누는 파이썬 코리아 창립 10주년 기념 행사에 함께하세요.
이 특별한 이벤트에서 파이썬의 즐거움과 감동을 느껴보세요.
예상 사항:
파이썬 전문가들의 토크 및 워크샵
동료 Pythonistas와 네트워킹 기회
오픈 소스 프로젝트 및 데모
그리고 훨씬 더!
Python 커뮤니티와 연결하고 최고의 소식을 배울 수 있는 이 기회를 놓치지 마세요.
 

 

2024] 파이콘 한국! 올해 슬로건과 일자를 공개합니다!
 
"Pythonic Moments!"
 
2024.10.25 ~ 27 - 수원 컨벤션센터
파이썬을 사용하는 작고 큰 활동과 순간을 공유하고
그 과정에서 느껴지는 재미와 감동의 경험을
올해 10주년을 맞이하는 파이콘 한국에서 만들어볼까요?
더욱 특별한 파이콘 한국 10주년의 순간에
여러분과 함께하길 기대합니다.
SNS를 구독하여 이어질 행사 정보를 가장 빠르게 받아보세요!
 

 

반응형
반응형

파이썬 가상환경과 아나콘다 가상환경은 프로젝트 간의 종속성 충돌을 피하고, 각 프로젝트별로 필요한 패키지를 독립적으로 관리할 수 있도록 도와줍니다. 아래는 각각의 가상환경 사용법을 설명합니다.
 



이와 같이 Python의 `venv` 모듈과 Anaconda의 `conda` 명령어를 사용하여 가상환경을 만들고 관리할 수 있습니다. 가상환경을 통해 프로젝트 간의 종속성 문제를 효과적으로 관리할 수 있습니다.

반응형
반응형

Python에서 현재 설치된 라이브러리(패키지) 목록을 확인하는 방법은 여러 가지가 있습니다. 
주로 pip 패키지 관리자를 사용하여 설치된 패키지 목록을 조회합니다. 
아래는 다양한 방법으로 현재 설치된 라이브러리 목록을 확인하는 방법을 설명합니다.

1. pip list 명령어 사용

가장 일반적인 방법은 터미널 또는 명령 프롬프트에서 pip list 명령을 사용하여 설치된 모든 패키지 목록을 조회하는 것입니다.


pip list




위 명령을 실행하면 설치된 모든 패키지의 목록이 출력됩니다.


2. pip freeze 명령어 사용

pip freeze 명령은 pip list와 유사하게 현재 환경에 설치된 패키지와 그 버전을 출력합니다. 이 명령은 보통 requirements.txt 파일을 생성하는 데 사용됩니다.


pip freeze




3. Python 스크립트를 통한 확인

Python 스크립트 내에서 pkg_resources 모듈을 사용하여 현재 설치된 패키지를 조회할 수 있습니다.

import pkg_resources

# 현재 설치된 패키지 목록 조회
installed_packages = pkg_resources.working_set
installed_packages_list = sorted(["%s==%s" % (i.key, i.version) for i in installed_packages])

for package in installed_packages_list:
    print(package)




4. conda list (conda 환경에서)

만약 Anaconda 또는 Miniconda와 같은 conda 패키지 관리자를 사용하고 있다면, conda list 명령을 사용하여 현재 환경에 설치된 패키지 목록을 확인할 수 있습니다.

conda list



위 방법 중 하나를 선택하여 현재 Python 환경에 설치된 모든 패키지 목록을 확인할 수 있습니다. 

주로 pip list 명령이 가장 일반적이고 널리 사용되는 방법입니다.

반응형
반응형

파이썬은 문자열을 다루는 다양한 메서드를 제공하여 문자열을 효과적으로 조작하고 처리할 수 있습니다. 이러한 메서드들은 문자열 객체에 대해 호출되는 내장 함수들입니다. 아래는 파이썬에서 자주 사용되는 문자열 메서드들을 한글로 설명한 것입니다:

1. str.upper(), str.lower()

  • upper(): 문자열의 모든 문자를 대문자로 변환합니다.
  • lower(): 문자열의 모든 문자를 소문자로 변환합니다.
python
Copy code
s = "Hello World" print(s.upper()) # 출력: "HELLO WORLD" print(s.lower()) # 출력: "hello world"

2. str.strip(), str.lstrip(), str.rstrip()

  • strip(): 문자열의 앞뒤로 있는 공백 문자(스페이스, 탭, 개행)를 제거합니다.
  • lstrip(): 문자열의 왼쪽에 있는 공백 문자를 제거합니다.
  • rstrip(): 문자열의 오른쪽에 있는 공백 문자를 제거합니다.
python
Copy code
s = " Hello " print(s.strip()) # 출력: "Hello" print(s.lstrip()) # 출력: "Hello " print(s.rstrip()) # 출력: " Hello"

3. str.split(), str.splitlines()

  • split(): 문자열을 지정된 구분자를 기준으로 분리하여 부분 문자열들의 리스트를 반환합니다 (기본 구분자는 공백).
  • splitlines(): 여러 줄로 구성된 문자열을 각 줄로 분리하여 리스트를 반환합니다.
python
Copy code
s = "사과,오렌지,바나나" print(s.split(',')) # 출력: ['사과', '오렌지', '바나나'] multiline_string = "첫째 줄\n둘째 줄\n셋째 줄" print(multiline_string.splitlines()) # 출력: ['첫째 줄', '둘째 줄', '셋째 줄']

4. str.join()

  • join(): 반복 가능한(iterable) 객체(예: 리스트)의 요소들을 문자열로 결합하여 하나의 문자열로 반환합니다.
python
Copy code
words = ['사과', '오렌지', '바나나'] print(', '.join(words)) # 출력: "사과, 오렌지, 바나나"

5. str.startswith(prefix), str.endswith(suffix)

  • startswith(): 문자열이 지정된 접두사(prefix)로 시작하는지 여부를 확인합니다.
  • endswith(): 문자열이 지정된 접미사(suffix)로 끝나는지 여부를 확인합니다.
python
Copy code
s = "안녕하세요" print(s.startswith("안녕")) # 출력: True print(s.endswith("하세요")) # 출력: True

6. str.replace(old, new), str.find(substring)

  • replace(): 문자열에서 지정된 구간의 모든 부분 문자열을 다른 문자열로 대체합니다.
  • find(): 문자열에서 지정된 부분 문자열의 첫 번째 등장 위치(인덱스)를 반환합니다.
python
Copy code
s = "안녕하세요" print(s.replace("하세요", "반갑습니다")) # 출력: "안녕반갑습니다" print(s.find("녕")) # 출력: 1 (녕의 위치는 인덱스 1)

7. str.isdigit(), str.isalpha(), str.isalnum(), str.isspace()

  • isdigit(): 문자열의 모든 문자가 숫자인지 여부를 확인합니다.
  • isalpha(): 문자열의 모든 문자가 알파벳(글자)인지 여부를 확인합니다.
  • isalnum(): 문자열의 모든 문자가 알파벳 또는 숫자인지 여부를 확인합니다.
  • isspace(): 문자열의 모든 문자가 공백 문자인지 여부를 확인합니다.
python
Copy code
s1 = "12345" s2 = "안녕" s3 = "안녕123" s4 = " " print(s1.isdigit()) # 출력: True print(s2.isalpha()) # 출력: True print(s3.isalnum()) # 출력: True print(s4.isspace()) # 출력: True

이것들은 파이썬에서 자주 사용되는 문자열 메서드들 중 일부입니다. 파이썬의 문자열 조작 기능은 매우 다양하므로 모든 메서드를 완벽하게 소개할 수는 없지만, 이러한 기본적인 메서드들을 숙지하고 활용하여 문자열을 효과적으로 다룰 수 있습니다.

반응형
반응형

[python] 생성된 엑셀을  Frequency 순으로,  동일 Frequency 이면 단어순으로 정렬

import pandas as pd
from collections import Counter
import re

def read_text_file(file_path):
    """텍스트 파일을 읽고 내용을 반환"""
    with open(file_path, 'r', encoding='utf-8') as file:
        return file.read()

def count_word_frequencies(text):
    """주어진 텍스트에서 단어 빈도수 계산"""
    words = re.findall(r'\b\w+\b', text.lower())
    return Counter(words)

def save_frequencies_to_excel(frequencies, output_file):
    """단어 빈도수를 엑셀 파일로 저장"""
    # 판다스 DataFrame으로 변환
    df = pd.DataFrame(list(frequencies.items()), columns=['Word', 'Frequency'])
    # 빈도수 내림차순, 단어 알파벳순 오름차순으로 정렬
    df = df.sort_values(by=['Frequency', 'Word'], ascending=[False, True])
    # 데이터를 엑셀 파일로 저장
    df.to_excel(output_file, index=False)

# 파일 경로
file_path = 'example.txt'
output_excel = 'word_frequencies.xlsx'

# 파일 읽기
text = read_text_file(file_path)

# 빈도수 분석
frequencies = count_word_frequencies(text)

# 엑셀로 저장
save_frequencies_to_excel(frequencies, output_excel)

print("단어 빈도수가 정렬되어 엑셀 파일로 저장되었습니다.")
  1. DataFrame 변환 및 정렬: pandas.DataFrame을 사용하여 빈도수 데이터를 DataFrame으로 변환한 후, sort_values 메소드를 사용하여 먼저 Frequency 열에 대해 내림차순으로, 동일한 빈도를 가진 항목에 대해서는 Word 열을 기준으로 오름차순 정렬합니다. ascending=[False, True] 파라미터는 각각 Frequency와 Word 열에 적용됩니다.
  2. 엑셀 파일 저장: 정렬된 데이터를 .xlsx 형식의 파일로 저장합니다.
반응형

+ Recent posts