Call by Value
함수에 인자를 넘길 때 값만 넘김.
함수 내에 인자 값 변경 시, 호출자에게 영향을 주지 않음
Call by Reference
함수에 인자를 넘길 때 메모리 주소를 넘김
함수 내에 인자 값 변경 시, 호출자의 값도 변경됨
Call by Object Reference
파이썬은 '객체의 주소가 함수'로 전달되는 방식
전달된 객체를 참조하여 변경 시 호출자에게 영향을 주나,
새로운 객체를 만들 경우 호출자에게 영향을 주지 않음
def span(eggs): # ham과 eggs가 같은 메모리 주소를 가르킴
eggs.append(1) # [0, 1]
eggs.append(5) # [0, 1, 5]
eggs = [2, 3] # 새로운 객체를 만들게 되어서 eggs의 주소가 끊김 print(eggs)
ham = [0]
spam(ham)
print(ham)
# [2, 3]
# [0, 1, 5]
def swap_value (x, y):
temp = x
x = y
y = temp
ex = [1, 2, 3, 4, 5]
swap_value(ex[0], ex[1])
ex
# [1, 2, 3, 4, 5]
값들의 주소만 바뀌기 때문에 리스트가 바뀌지 않는다.
def swap_offset(offset_x, offset_y):
temp = ex[offset_x]
ex[offset_x] = ex[offset_y] #
ex[offset_y] = temp
swap_offset(0, 1)
ex
# [2, 1, 3, 4, 5]
def swap_reference (list_ex, offset_x, offset_y):
temp = list_ex[offset_x]
list_ex[offset_x] = list_ex[offset_y]
list_ex[offset_y] = temp
ex = [1, 2, 3, 4, 5]
swap_reference(ex, 3,4)
ex
# [1, 2, 3, 5, 4]
def test(t): # test(x)
print(x) # 10
t = 20 # 새로운 값은 넣어줌. 연결고리 끊어짐
print('in funtion:', t)
x = 10
test(x)
print(t)
지역변수 : 함수내에서만 사용 -> t
전역변수 : 프로그램전체에서 사용
def f():
s = 'I love London!'
print(s)
s = 'I love Paris!'
f()
print(s)
# I love London!
# I love Paris!
def f():
global s # 전역변수의 s
s = 'I love London!'
print(s)
s = 'I love Paris!'
f()
print(s)
# I love London!
# I love London!
def calculate(x, y):
total = x + y # 새로운 값이 할당되어 함수 내 total은 지역변수가 됨
print('In Function')
print('a:', str(a), 'b:', \
str(b), 'a+b:', str(a+b), 'total:', str(total))
return total
a = 5 # a와 b는 전역변수
b = 7
total = 0 # 전역변수 total
print('In Program - 1')
print('a:', str(a), 'b:', str(b), 'a+b:', str(a+b))
sum = calculate (a,b)
print('After Calculation')
print('Total :', str(total), 'Sum:', str(sum)) # 지역변수(total)는 전역변수에 영향 x
## return된 total은 sum에 저장
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1)
print(factorial(int(input('Input Number for Factorial Calculation: '))))
# input = 5
# 120