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

    测试结果:

  • 相关阅读:
    C++类的成员函数的指针和mem_fun适配器的用法
    C++ RTTI的使用
    C++特殊工具与技术之RTTI
    Linux组件封装之五:生产者消费者问题
    Linux组件封装之四:RAII实现MutexLock自动化解锁
    Linux组件封装之三:Thread
    Linux组件封装之二:Condition
    Linux组件封装之一:MUtexLock
    C++ socket与Flex as3通信的沙盒问题解决
    CentOS搭建PHP环境
  • 原文地址:https://www.cnblogs.com/yszd/p/9149846.html
Copyright © 2011-2022 走看看