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)

得到对应的结果为如下截图:

可以看到, 传递不可变对象, 当形参+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)

得到对应的结果为如下截图:

# Python第十节 传参的更多相关文章

  1. 『Python × C++』函数传参机制学习以及对比

    一.Python函数传参 在python中,函数传参实际上传入的是变量的别名,由于python内在的变量机制(名称和变量值相互独立),只要传入的变量不可变(tuple中的元素也要是不可变的才行),那么 ...

  2. python字符串格式化--dict传参

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python字符串格式化--dict传参 print "I'm %(name)s. I'm %(a ...

  3. python 线程创建和传参(28)

    在以前的文章中虽然我们没有介绍过线程这个概念,但是实际上前面所有代码都是线程,只不过是单线程,代码由上而下依次执行或者进入main函数执行,这样的单线程也称为主线程. 有了单线程的话,什么又是多线程? ...

  4. python 传值引用和传参引用

    调用同事的函数,传入goods_list,获取商品信息,然后将商品信息与goods_list的信息进行匹配,合并. 但是同事返回数据的同时改变了我传入的参数,goods_list.相当于传参引用,也就 ...

  5. Python中的引用传参

    Python中函数参数是引用传递(注意不是值传递).对于不可变类型,因变量不能修改,所以运算不会影响到变量自身:而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量. 引用传参一: >& ...

  6. python之路--动态传参,作用域,函数嵌套

    一 . 动态传参(重点)  * ,  ** * 与 ** * 在形参位置. * 表示不定参数, 接收的是位置参数 接收到的位置参数的动态传参: 都是元组 def eat(*food): # 在形参这里 ...

  7. python函数的动态传参.作用域与命名空间

    一.动态传参1.*表示动态传参. 可以接受所有的位置参数传参的时候自动的把实参打包成元组 交给形参 def chi(*food): print(food) chi() # 动态传参可以不传参数 chi ...

  8. python记录_day10 动态传参 命名空间 作用域

    一.动态传参 动态传参用到 *args 和 **kwargs ,*号表示接收位置参数,args是参数名:**表示接收关键字参数,kwargs是参数名 def chi(*food): print(foo ...

  9. Python函数定义及传参方式

    主要内容:     1.函数初识     2.函数传参方式        (1)位置参数        (2)默认参数        (3)关键参数        (4)非固定传参 一.函数初识 1. ...

随机推荐

  1. 控制 if 语句 while循环 break continue

    if 语句的语法: 1. if 条件 :   #引号是将条件与结果分开 代码块   # 四个空格,或者一个tab键,这个是告诉程序满足这个条件的 说明: 当条件成立的时候(True), 代码块会被执行 ...

  2. 使用 QSqlTableModel 模型向数据库中插入数据时,为什么使用 rowCount 函数只能返回 256 最大值?

    默认返回缓冲区里面的数据,如果你向要获取更多值,请在前面加入以下语句即可. while(model.canFetchMore()){ model.fetchMore(); } 该语句会获取更多的记录.

  3. java并发编程之美-阅读记录1

    1.1什么是线程? 在理解线程之前先要明白什么是进程,因为线程是进程中的一个实体.(线程是不会独立存在的) 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程中的 ...

  4. c# 使用网站的身份验证及 Cookie 的获取与使用

    C# 的 Http 访问可以使用 .net 自带的  HttpWebRequest, WebClient, HttpClient 类.也可以使用开源库 RestSharp . RestSharp 的优 ...

  5. Java面试宝典(7)混合2

    数据库 & XML & 流行的框架与新技术 & 软件工程与设计模式 & J2EE & EBJ & webservice & 其他 pageSiz ...

  6. C++ 排序(未完)

    参考: 快速排序 堆排序 各类排序 #include <iostream> #include <vector> #include <time.h> #include ...

  7. Mysql查看编码方式

    查看数据库的字符集 show variables like 'character\_set\_%'; 输出: +--------------------------+--------+ | Varia ...

  8. STM32点LED灯

    一.建立项目模板 这里的user中重复引用了system_stm32f10x.c Output中选择Create HEXFile,并且可以选择输出路径. Listing中可以选择输出路径. 然后在C/ ...

  9. OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类

    昨天学习了Foundation框架中NSArray类和NSMutableArray类:http://blog.csdn.net/jiangwei0910410003/article/details/4 ...

  10. [CSP-S模拟测试62]题解

    A.Graph 因为点可以随便走,所以对于每个联通块,答案为边数/2向下取整. 用类似Tarjan的方式,对于每个联通块建立一棵搜索树,尽量让每一个节点的儿子两两配对,如果做不到就用上头顶的天线. # ...