問:python函數(shù)在執(zhí)行過程中會不會改變參數(shù)所指向原來對象的值楞艾?
解答如下,直接看代碼
def immutable(number):
# python 不可變對象包括:數(shù)字龄广,字符串硫眯,元組
number = 10
def mutable(list):
# python 可變對象包括: 列表,字典择同,集合
list[0] = 10
if __name__ == '__main__':
num = 1
list = [1, 2]
print("傳遞前: ")
print("num: ", num, "\nlist: ", list)
immutable(1)
mutable(list)
print("傳遞后: ")
print("num: ", num, "\nlist: ", list)
## 結果
"""
傳遞前:
num: 1
list: [1, 2]
傳遞后:
num: 1
list: [10, 2]
"""
??從上面輸出結果可以看出两入,當傳遞的參數(shù)為不可變對象
時,函數(shù)中的執(zhí)行語句是不會改變原來對象的值敲才;而傳遞可變對象
時,函數(shù)中執(zhí)行語句會改變原來對象的值紧武。
??原因在于python中傳遞的都是引用剃氧,而沒有c++所謂的值傳遞的概念,具體可以看如下代碼:
def isSameId(num):
print(id(num))
if __name__ == '__main__':
num = 4000
# id()函數(shù)用于獲取對象的內存地址
print(id(num))
isSameId(num)
# 結果
"""
2697365130000
2697365130000
"""
??從上面可以看出id
值在傳遞前后都是相同的脏里,所以python中傳遞的都是引用她我,也就是說函數(shù)中操作的對象就是參數(shù)所指向的對象本身。因此也就容易理解python函數(shù)中改變可變對象
的值會改變原來的對象迫横,而不可變對象
雖然傳遞的是引用番舆,但由于本身其就是不可改變的,因此試圖改變其值的操作都只是將此參數(shù)指向新的對象而已矾踱。示例如下:
def isSameId(num):
print(id(num))
num = 10 # 試圖改變不可變對象的值
print(id(num)) # num指向新的對象
if __name__ == '__main__':
num = 4000
print(id(num))
isSameId(num)
# 結果
"""
1569160399632
1569160399632
140735650449344
"""