[Python] 변수 - Mutable vs Immutable

2023. 1. 13. 23:28파이썬(Python)

반응형

immutable type : tuple, string, int, bool 등

mutable type : list, dict 등

 

1. immutable

def swap(a,b):
    a,b=b,a
    print(a,b)

n,m=1,2
swap(n,m)
print(n,m)

결과

2 1
1 2

 

- immutable 변수가 함수의 인자로 넘어가게 되면, 변할 수 없는 특성 때문에 변수가 갖고 있던 값을 복사하여 값을 넘겨주게 된다.

- int형 변수인 n, m이 함수 인자로 넘어간 것이 아닌 n, m 값이 a, b에 복사되어 넘어가게 된 것이다.

- 함수 안에서 a, b 값은 바뀌게 되어 출력했지만 함수를 빠져나오고 n, m은 변화가 없으므로 그대로 출력된다.

 

- 함수를 적용시키기 위해서는 다음과 같다.

def swap(a,b):
    a,b=b,a
    return a,b 

n,m=1,2
n,m=swap(n,m)
print(n,m)

결과

2 1

 

● 문자열을 인자로 받을 때

def add_str(string):
    string+='world'

input_str=input()
add_str(input_str)

print(input_str)

결과

>> hello
hello

 

- stringimmutable하기 때문에 함수 인자로 넘기게 되면 값을 복사하여 넘어가기 때문에 함수 안에서 어떠한 일이 일어나더라도 밖에 있는 변수에 영향을 끼치지 않는다.

- 함수 안에서의 역할을 밖에 있는 변수에 영향을 끼치고 싶다면 해당 문자열을 반환하는 함수를 추가

 

def add_str(string):
    string+='world'
    return string

input_str=input()
input_str=add_str(input_str)

print(input_str)

결과

>> hello
helloworld

2. mutable

def change(arr):
    arr[0],arr[3]=arr[3],arr[0]

list_a=[1,2,3,4]
change(list_a)
print(list_a)

결과

[4, 2, 3, 1]

 

- list는 mutable하기 때문에 mutable한 변수를 함수 인자로 넘기게 되면 주소가 넘어가게 되기 때문에 함수 안에서 해당 인자에 주는 모든 변화가 함수 호출시 넘겼던 변수에 남기게 된다.


Q) 세 정수의 연산값

- 서로 다른 세 정수가 입력.

- 제일 큰 값두 번째로 큰 값더한 값.

- 그리고 두 번째로 큰 값제일 작은 값더한 값을 출력.

 

def operation(n1,n2,n3):
    if n1>n2:
        if n2>n3:
            return n1+n2, n2+n3
        else:
            return n3+n1, n1+n2
    elif n1>n3:
        if n3>n2:
            return n1+n3, n3+n2
        else:
            return n2+n1, n1+n3
    if n2>n1:
        if n2>n3:
            return n2+n3, n3+n1
        else:
            return n3+n2, n2+n1


a,b,c=map(int,input().split())
m1, m2=operation(a,b,c)
print(m1,m2)

결과

>> 4 3 8
12 7

- 입력 값의 크기 순은 8, 4, 3 이므로 8+4, 4+3의 값이 출력된다.


Q) +, - 변경

- 정수 n을 입력.

- n개의 정수를 입력

- 음수는 양수양수는 음수로 변경하여 n개의 정수의 합을 출력

def plus_minus_change(arr):
    for elem in range(n):
        arr[elem]=arr[elem]*(-1)

n=int(input())
num_list=list(map(int,input().split()))
plus_minus_change(num_list)
print(sum(num_list))

결과

>> 5
>> -20 20 5 15 -35
15

- 함수를 적용하면 n개의 입력 값은 20 -20 -5 -15 35 이므로 이들의 합은 15가 나온다.


Q) Palindrome 판단

- 문자열을 입력

- palindrome (문자열을 뒤집었을 때도 동일한 문자열)이 맞으면 Yes. 아니면 No

- 만약 palindrome이면 같은 쌍의 개수를 출력

def palindrome(string):
    isPalindrome=True
    cnt=0
    for i in range(len(string)//2):
        if string[i]==string[len(string)-i-1]: cnt+=1
        else:
            isPalindrome=False
            break
    return isPalindrome,cnt

input_string=input()
isPalindrome,pair_count=palindrome(input_string)

if isPalindrome:
    print('Yes', pair_count)
else:
    print('No')

결과

>> abcba
Yes 2

- 같은 쌍의 개수는 a, b 2개이다.

 

>> abccba
Yes 3

- 같은 쌍의 개수는 a, b, c 3개이다.

 

>> abcdefg
No

 

- palindrome을 만족시키기 위해서는 단어를 반으로 나눠 대칭이어야 한다.

- 따라서 단어의 처음과 끝을 지정하여 같으면 조건에 성립하고, 다르면 성립하지 않는다.

- 처음 부분은 1씩 증가하고 끝 부분은 1씩 감소하여 조건에 맞는지 확인한다.

- 조건에 성립하면 쌍의 개수를 1 증가한다.