Python參數傳遞(傳值&傳引用)


# 測試參數是傳值還是傳引用
def test(arg):
  print("test before")
  print(id(arg))
  arg[1]=30 # 測試可變對象
  # arg[3][2] = 16 # 測試嵌套類型
  # arg = list(range(5))
  print("test after")
  print(id(arg))
  return arg
change_loc = 1
if change_loc == 1:
  # 傳入可變對象
  my_list = list(range(5))
  print(my_list)
  print(id(my_list))
  test(my_list)
  print(my_list)
  print(id(my_list))
else:
  # 傳入不可變對象(元組中嵌套列表)
  my_tuple = (3,5,"abc",my_list) # list(range(6)不能在元組中直接寫創建列表可以替換成創建好的列表對象
  print(my_tuple[3][2]) # 要測試修改的元組中列表的某個元素
  print(id(my_tuple)) # 傳入前元組引用
  print(id(my_tuple[3])) # 傳入前元組中列表引用
  test(my_tuple)
  print(my_tuple[3][2]) # 要測試修改后的元組中列表的某個元素
  print(id(my_tuple)) # 傳入后元組引用
  print(id(my_tuple[3])) # 傳入后元組中列表引用
# Python參數傳遞采用的是“傳對象引用”的方式。這種方式相當於傳值和傳引用的一種綜合。
# 如果函數收到的是一個可變對象(比如字典或者列表)的引用,就能修改對象的原始值--相當於通過“傳引用”來傳遞對象。
# 如果函數收到的是一個不可變對象(比如數字、字符或者元組)的引用,就不能直接修改原始對象--相當於通過“傳值'來傳遞對象。

總結:函數傳值時如果傳不可變對象,就不能修改原始值;傳可變變量就能改原始值。如果傳嵌套的數據類型(例如:("you",['Jack', 'Rose'])) 元組中包含列表或[{'Tom', 'Jim', 'Mary'},{'Jack', 'Rose'}] 列表中包含集合等)修改限制從外及內,直接相連的兩層外層限制內層,不直接相連的沒有直接影響。就拿元組包含列表為例:元組不能直接修改,因此元組內的各個數據的引用不能修改;列表支持修改,因此可以修改元組內列表中的數據,這並不影響元組本身的不可修改性,因為列表的引用沒變;元組對其內列表中的數據沒有直接影響力,其它嵌套結構分析類似!!!

測試結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM