关于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语言中的变量是不同的。很重要!!!!!!!!!!!!!!!!!


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中的字典可以作为参传递给函,这种方式在处理需要特定配置参或者有大量可变参场景下非常有用。 ### 使用字典传参的基本步骤: 假设有一个函 `my_function` 需要一些参来运行操作,并允许通过字典的形式提供额外的参设置。 ```python def my_function(param_a, param_b=None, param_c=True, **kwargs): if param_b is None and 'param_b' in kwargs: param_b = kwargs['param_b'] # 其他基于参的操作 print(f"param_a: {param_a}, param_b: {param_b}, param_c: {param_c}") ``` 在这个例子中,`**kwargs` 接收所有未指定名称的参并打包成字典形式。这意味着你可以像下面这样调用这个函: ```python config_dict = {'param_b': 'value', 'another_param': 'extra_value'} my_function(5, param_c=False, **config_dict) ``` ### 函内部的处理: 1. **检查默认值**: 如果某个参没有直接给出,则从字典中查找。 2. **处理键存在与否**: 确保只访问实际存在的键,避免引发异常。 3. **利用字典动态获取参**: 可以通过字典名[key]的方式访问每个参的值。 ### 示例输出: 如果上面的例子运行,输出将会是: ``` param_a: 5, param_b: value, param_c: False ``` 这里,虽然我们明确指定了 `param_a`, `param_c` 和通过字典间接设置了 `param_b` 的值,但由于 `param_c` 的默认值被修改为 `False`,所以最终它取的是这个新的值。 ### 相关问题: 1. 当在 Python中接收字典参时,如何确保所有的必需键都被覆盖了? 2. 怎样在函内部安全地访问和处理从字典中传来的非预期键? 3. Python如何优雅地处理字典参中的缺失键?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值