zoukankan      html  css  js  c++  java
  • # Python第十节 传参

    Python第十节 传参

    #### 一. 变量和变量名 首先说明变量名和变量的一点差异 例如: `var = [1, 2, 3]` `var = "Google" 调用变量var的时候, 既可以得到的是list类型,也可以是字符串类型。why? 事实上需要分开看 [1, 2, 3]是list类型数据, “Google”是字符串类型的数据。但是变量a是没有类型之分的, 他就是一个对象的引用, 是一个指针(可以理解为里面存的是一个地址),它可以指向list型(可以存list类型地址),也可以指向String类型(也可以存String类型的地址)。

    二. 可变mutable和不可变(immutable)对象

    • 不可变
      • String tuple number 等等
      • str = "immutable",当进行str = "mutable"的操作时, 实际上是生成了新的string变量"mutable", 再将str指向"mutable"。
    • 可变
      • list dict set 等等
      • lis = [1, 2, 3] 当进行lis[1] = 2.5的操作时, lis指向的对象依然还是原来那篇区域。

    三. 参数传递

    在C++中有值传递和引用传递
    在Python中一切都是对象, 严格说法不能说值传递和引用传递、

    3.1. 值传递(passl-by-value)

    在调用函数时将实际参数复制一份传递给函数的形参.

    • 在堆栈内存中为形参开辟内存空间, 用于存放传递给形参的值。实际上并不是实参本身,而是生成了一个副本。
    • 被调函数的形参在函数体内是局部变量的存在,并不会影响实际参数的值
    3.2. 引用传递(pass-by-reference)

    引用传递是指在调用函数时将实际参数的地址传递到函数中

    • 在堆栈内存中为形参开辟内存空间, 存放的是实际参数的地址值。
    • 被调函数对形参的处理, (我们认为逻辑实现)相当于对“对应地址”内的数据进行更新操作,即访问的事实上是实参的值。
    • 被调函数对形参做的任何操作都影响了主调函数中的实参变量
    3.3. 对python的值传递

    Python的传递事实上是引用传递。但是结合Python的可变对象和不可变对象, 做如下区分:

    • 传递的是不可变对象的引用, 对形参在函数体内的任何操作对实参都无影响
    • 传递的是可变对象的引用
      • 当操作的是形参本身, 那肯定对实参无影响
      • 当操作的是形参指定的地址的数据, 对实参是有影响的
        说白了, 其实python和C++并不冲突, 只不过是如何拆分逻辑的不同而已
    3.4 实例
    • 传递的是不可变对象的引用

      # transfer parameter
      from ctypes import *
      import os.path
      import sys
      def ParaTransfer(para):
          print("     形参para   的地址是 : ", id(para), "形参值是 : ", para)
          para += 20
          print("     形参+20, 形参地址是 : ", id(para), "形参值是 : ", para)
      
      if __name__ == '__main__':
          actual_para = 10
          print("实验开始前声明的实参地址是 : ", id(actual_para), "实参值是 : ", actual_para)
          ParaTransfer(actual_para)
          print("实验结束后声明的实参地址是 : ", id(actual_para), "实参值是 : ", actual_para)
      

    得到对应的结果为如下截图:
    rank() over

    可以看到, 传递不可变对象, 当形参+20, 对参数做了改变, 但实参并无变化。这是因为形参+20,实际上在堆内存新开辟空间生成了新的对象, 将地址传递给形参。

    • 传递的是可变对象

      from ctypes  import *
      import os.path
      import sys
      def MuParaTransfer(mupara):
          print("可变形参的地址是:", id(mupara), "形参值是:", mupara)
          mupara[len(mupara)-1] = 10
          print("可变形参更新过后的地址是:", id(mupara), "形参值是:", mupara)
      
      if __name__=="__main__":
          mu_list = ['changchang', 25, 'female']
          print('实参mu_list的地址是:', id(mu_list), '实参值是:', mu_list)
          MuParaTransfer(mu_list)
          print('更新后实参mu_list的地址是:', id(mu_list), '实参值是:', mu_list)
      

    得到对应的结果为如下截图:
    rank() over

  • 相关阅读:
    成都Uber优步司机奖励政策(2月18日)
    北京Uber优步司机奖励政策(2月18日)
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(2月18日)
    优步UBER司机全国各地最新奖励政策汇总(持续更新...)
    新年Uber司机端换新装啦!
    百度参投 Uber中国12亿美元融资已到账
    人民优步+(拼车)自动接单功能上线
    vi 调到第一行,或最后一行
    linux文本操作界面 vi面板如何复制一行
    Apache支持多端口配置处理
  • 原文地址:https://www.cnblogs.com/Sinkinghost/p/11710698.html
Copyright © 2011-2022 走看看