关于Python、C语言的传参问题
关于Python与c语言的传参问题
- Python中
- c语言中
- 要理解Python中的变量与c语言中的变量是不同的。很重要!!!!!!!!!!!!!!!!!
我们都知道函数的参数分为形参和实参。
形参就是指函数声明中的参数。
实参就是指才函数调时所需的参数。
函数的形参实质上是以局部变量的形式存在函数内部。
Python中的变量好像是一个标签。
c语言中的变量是数据内存位置的名称。C语言中的变量也有自己的地址,如int a;(可以不赋值,而Python中的变量在声明时必须赋值),a = 2,(实质是开辟4个字节的内存空间存放2,同时把这一段空间的起始地址赋值给a,即将这个起始地址存储到a中)。
Python中
我认为Python中传参时,实质传递的是实参的地址。在Python中的数据类型又分为可变数据类型与不可变数据类型。其中可变数据类型包括(number、string、tuple),不可变数据类型包括(list、set、dict)。
例如,
当传递的实参是不可变数据类型时,相当于将实参所指向地址传递给了形参,即使形参和实参同时指向了同一块地址单元。如果在函数内部修改形参,实参是不会改变的。这种改变实质修改了形参所指向的地址单元(因为实参是不可变数据类型)。从形式上看是所谓的值传递,就其本质而言是地址传递。
当传递的实参是可变数据类型时,调用函数是的参数传递本质也是地址传递,如实参是一个list类型,参数的传递实质是将实参所指向的地址赋值给形参,此时实参和形参指向同一块地址单元。在函数内部修改形参的内容时,由于实参是可变数据类型,相当于就是修改形参所指向的内存单元中的内容,因为形参和实参指向的是同一块地址单元,所以在函数中修改形参时实参的内容也会改变。这种情况下称之为地址传递,本质也就是地址传递。
因此,Python中的参数传递本质上都是地址传递,只是根据实参的类型不同,其表现的形式不同,我们区分为值传递与地址传递。
c语言中
我认为c语言中的参数传递默认都是值传递,即是将实参的值复制一份赋值给形参,在这种情况下形参内容的修改是不会影响实参的,因为形参和实参的地址是不同的。(值传递)
如果想要通过形参的改变修改实参,在参数的的传递时要传递实参的地址,在函数中的形参(局部变量)会复制实参地址,通过修改实参地址所指向内存单元中的内容,从而修改实参。(地址传递)实参的地址(实参变量中保存的地址),地址传递有点类似于计算机组成原理中的直接寻址
在c++中还用一种引用传递(实参变量的别名,实质传递的是实参变量的地址),通过在函数声明的头部的形参前面添加&的标识。这种引用传递与地址传递的作用效果相同,但是原理不同。引用传递在函数中开辟了一段地址空间存放的是实参变量的地址,在修改实参时,首先要通过实参变量的地址找到实参变量,再从实参变量中取出实参的地址,需要经过两次寻址,类似于计算机组成原理中的间接寻址。
要理解Python中的变量与c语言中的变量是不同的。很重要!!!!!!!!!!!!!!!!!
关于Python、C语言的传参问题相关推荐
- 【python教程入门学习】Python函数定义及传参方式详解(4种)
这篇文章主要介绍了Python函数定义及传参方式详解(4种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一.函数初识 1.定 ...
- 『Python × C++』函数传参机制学习以及对比
一.Python函数传参 在python中,函数传参实际上传入的是变量的别名,由于python内在的变量机制(名称和变量值相互独立),只要传入的变量不可变(tuple中的元素也要是不可变的才行),那么 ...
- Python 线程创建和传参 - Python零基础入门教程
目录 一.Python 线程解释 二.Python 线程创建和启动 1.导入线程模块 2.创建线程并初始化线程 3.启动线程 三.Python 线程传参 四.Python 线程结束 五.Python ...
- python 构造函数传参_C++和python混合编程之在python类构造函数中传参方法
C++和python混合编程 零.前言 一.说明 二.测试代码 1.C++代码 2.python代码 三.运行结果 零.前言 C++是一门高效率的语言,Python是一门简单易学的脚本语言,现在Pyt ...
- 2021-01-14python函数传参是传值还是传引用? 参数若是简单类型是传值 若是对象类型则是传引用,python是兼容两者传参方式的
python函数传参是传值还是传引用? 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题. ...
- python get请求 url传参_requests的get请求url参数、url重定向处理及cookies
需求:在百度搜索www.python66.com,然后将搜索结果保存到文件bd_python66.html 百度搜索的url:https://www.baidu.com/s?wd=搜索词 params ...
- 一篇让你弄明白C语言指针传参和数组传参~
文章目录 前言 ⭐️指针传参和数组传参 ⭐️一维数组传参 ⭐️一级指针传参 ⭐️一道经典的指针传参相关题目 ⭐️二维数组传参 ⭐️函数指针!!! ⭐️一个有趣的代码!(*(void( * )())0) ...
- java给r语言传参数_R语言的传参
越南式三明治 1. mac或linux: 脚本第一行加:#!/usr/bin/Rscript 2. commandArgs()传参: 测试脚本test.R:args print(args[1]) pr ...
- 【☀️C语言函数传参の结构体数组篇☀️】
背景介绍 C语言中函数参数传递的两种方式("引用传递做函数参数"是C++的特性,C语言不支持.) (1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个 ...
最新文章
- 【Qt】通过QtCreator源码学习Qt(八):插件生命周期及对应状态(代码走读)
- new和make的区别
- PdfSharp.dll 更改pdf 設置 如不能複製,列印等
- class com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$Text
- matlab 子图title的位置_matlab 画图基本介绍
- 字符编码 ASCII,Unicode和UTF-8的关系
- SRS为何加入木兰社区孵化?
- jsp项目如何定位当前页面是哪个jsp
- 计算机一级报名照片是几寸的,一级建造师报名照片要几寸的
- 大数据安全和网络安全基础知识
- vue模板引擎_Vue.js模板引擎理解
- 田申:《个人信息安全规范》的理解与初探
- 熊猫猪新系统测试之四:Ubuntu 14.04
- 为公司添加以网站作为邮箱后缀的企业邮箱
- 二次开发 uiautomatorviewer
- 照片加水印怎么弄?方法详细介绍
- Chrome谷歌浏览器插件的本地存放位置
- 单链表的创建、删除、反转、插入、排序操作
- three.js html5,html5 – 使用Three.js进行纹理喷涂
- OLED屏幕笔记本 | 看久了眼睛不舒服 | 调整