关于Python与c语言的传参问题

  • Python中
  • c语言中
  • 要理解Python中的变量与c语言中的变量是不同的。很重要!!!!!!!!!!!!!!!!!

我们都知道函数的参数分为形参实参
形参就是指函数声明中的参数。
实参就是指才函数调时所需的参数。
函数的形参实质上是以局部变量的形式存在函数内部。

Python中的变量好像是一个标签。
c语言中的变量是数据内存位置的名称。C语言中的变量也有自己的地址,如int a;(可以不赋值,而Python中的变量在声明时必须赋值),a = 2,(实质是开辟4个字节的内存空间存放2,同时把这一段空间的起始地址赋值给a,即将这个起始地址存储到a中)。

Python中

我认为Python中传参时,实质传递的是实参的地址。在Python中的数据类型又分为可变数据类型不可变数据类型。其中可变数据类型包括(numberstringtuple),不可变数据类型包括(listsetdict)。
例如,

当传递的实参是不可变数据类型时,相当于将实参所指向地址传递给了形参,即使形参实参同时指向了同一块地址单元。如果在函数内部修改形参,实参是不会改变的。这种改变实质修改了形参所指向的地址单元(因为实参是不可变数据类型)。从形式上看是所谓的值传递,就其本质而言是地址传递。

当传递的实参是可变数据类型时,调用函数是的参数传递本质也是地址传递,如实参是一个list类型,参数的传递实质是将实参所指向的地址赋值给形参,此时实参形参指向同一块地址单元。在函数内部修改形参的内容时,由于实参是可变数据类型,相当于就是修改形参所指向的内存单元中的内容,因为形参实参指向的是同一块地址单元,所以在函数中修改形参实参的内容也会改变。这种情况下称之为地址传递,本质也就是地址传递。

因此,Python中的参数传递本质上都是地址传递,只是根据实参的类型不同,其表现的形式不同,我们区分为值传递地址传递

c语言中

我认为c语言中的参数传递默认都是值传递,即是将实参的值复制一份赋值给形参,在这种情况下形参内容的修改是不会影响实参的,因为形参实参的地址是不同的。(值传递

如果想要通过形参的改变修改实参,在参数的的传递时要传递实参的地址,在函数中的形参局部变量)会复制实参地址,通过修改实参地址所指向内存单元中的内容,从而修改实参。(地址传递)实参的地址(实参变量中保存的地址),地址传递有点类似于计算机组成原理中的直接寻址

在c++中还用一种引用传递(实参变量的别名,实质传递的是实参变量的地址),通过在函数声明的头部的形参前面添加&的标识。这种引用传递地址传递的作用效果相同,但是原理不同。引用传递在函数中开辟了一段地址空间存放的是实参变量的地址,在修改实参时,首先要通过实参变量的地址找到实参变量,再从实参变量中取出实参的地址,需要经过两次寻址,类似于计算机组成原理中的间接寻址


要理解Python中的变量与c语言中的变量是不同的。很重要!!!!!!!!!!!!!!!!!


关于Python、C语言的传参问题相关推荐

  1. 【python教程入门学习】Python函数定义及传参方式详解(4种)

    这篇文章主要介绍了Python函数定义及传参方式详解(4种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一.函数初识 1.定 ...

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

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

  3. Python 线程创建和传参 - Python零基础入门教程

    目录 一.Python 线程解释 二.Python 线程创建和启动 1.导入线程模块 2.创建线程并初始化线程 3.启动线程 三.Python 线程传参 四.Python 线程结束 五.Python ...

  4. python 构造函数传参_C++和python混合编程之在python类构造函数中传参方法

    C++和python混合编程 零.前言 一.说明 二.测试代码 1.C++代码 2.python代码 三.运行结果 零.前言 C++是一门高效率的语言,Python是一门简单易学的脚本语言,现在Pyt ...

  5. 2021-01-14python函数传参是传值还是传引用? 参数若是简单类型是传值 若是对象类型则是传引用,python是兼容两者传参方式的

    python函数传参是传值还是传引用? 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题. ...

  6. python get请求 url传参_requests的get请求url参数、url重定向处理及cookies

    需求:在百度搜索www.python66.com,然后将搜索结果保存到文件bd_python66.html 百度搜索的url:https://www.baidu.com/s?wd=搜索词 params ...

  7. 一篇让你弄明白C语言指针传参和数组传参~

    文章目录 前言 ⭐️指针传参和数组传参 ⭐️一维数组传参 ⭐️一级指针传参 ⭐️一道经典的指针传参相关题目 ⭐️二维数组传参 ⭐️函数指针!!! ⭐️一个有趣的代码!(*(void( * )())0) ...

  8. java给r语言传参数_R语言的传参

    越南式三明治 1. mac或linux: 脚本第一行加:#!/usr/bin/Rscript 2. commandArgs()传参: 测试脚本test.R:args print(args[1]) pr ...

  9. 【☀️C语言函数传参の结构体数组篇☀️】

    背景介绍 C语言中函数参数传递的两种方式("引用传递做函数参数"是C++的特性,C语言不支持.) (1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个 ...

最新文章

  1. 【Qt】通过QtCreator源码学习Qt(八):插件生命周期及对应状态(代码走读)
  2. new和make的区别
  3. PdfSharp.dll 更改pdf 設置 如不能複製,列印等
  4. class com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$Text
  5. matlab 子图title的位置_matlab 画图基本介绍
  6. 字符编码 ASCII,Unicode和UTF-8的关系
  7. SRS为何加入木兰社区孵化?
  8. jsp项目如何定位当前页面是哪个jsp
  9. 计算机一级报名照片是几寸的,一级建造师报名照片要几寸的
  10. 大数据安全和网络安全基础知识
  11. vue模板引擎_Vue.js模板引擎理解
  12. 田申:《个人信息安全规范》的理解与初探
  13. 熊猫猪新系统测试之四:Ubuntu 14.04
  14. 为公司添加以网站作为邮箱后缀的企业邮箱
  15. 二次开发 uiautomatorviewer
  16. 照片加水印怎么弄?方法详细介绍
  17. Chrome谷歌浏览器插件的本地存放位置
  18. 单链表的创建、删除、反转、插入、排序操作
  19. three.js html5,html5 – 使用Three.js进行纹理喷涂
  20. OLED屏幕笔记本 | 看久了眼睛不舒服 | 调整

热门文章

  1. 实现Dart版本对象存储(COS)插件
  2. 0Cr15Ni7Mo2Al(15-7PH)钢的化学成分
  3. Hadoop气象数据
  4. Java日期格式转换成星期几
  5. 不涉及代码,来聊聊用户画像
  6. Steam客户端更新:Linux增加2倍缩放模式,支持Windows 10的HiDPI
  7. Java对接腾讯云短信和阿里云天气预报
  8. 5个微信公众号加粉好方法,不看白不看!
  9. 无参构造函数和有参构造函数在创建对象时初始化的使用
  10. Ubuntu 编译安装Nginx