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'}] 列表中包含集合等)修改限制从外及内,直接相连的两层外层限制内层,不直接相连的没有直接影响。就拿元组包含列表为例:元组不能直接修改,因此元组内的各个数据的引用不能修改;列表支持修改,因此可以修改元组内列表中的数据,这并不影响元组本身的不可修改性,因为列表的引用没变;元组对其内列表中的数据没有直接影响力,其它嵌套结构分析类似!!!

测试结果:

猜你喜欢

转载自www.cnblogs.com/yszd/p/9149846.html