调用函数时为啥形参的值不能传给实参

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用函数时为啥形参的值不能传给实参相关的知识,希望对你有一定的参考价值。

因为C语言中,参数的传递是数值传递方法,也就是说,在给函数传递参数时,使用的不是你传递的实参的内存空间,而是重新分配内存,将实参的数值复制到新内存中,被调用的函数就是使用新分配的内存,函数返回时,这些新内存就会被释放,而源内存中的内容没有改变。
要想通过调用函数改变实参的值,就需要使用指针或引用的技术。
参考技术A 形参 相当于局部变量
等效于 定义了
type xingcan=shican;
这样的变量
定义后, xingcan和shican只是值相同 ,其它的没关系
于是 当在函数里面对形参赋值 就不会影响实参了。本回答被提问者采纳

python基础6-函数的参数

形参与实参
形参:在函数定义阶段,括号内定义的参数的称为形参,就相当于变量名
实参:在函数调用阶段,括号内定义的参数的称为实参,就相当于变量值
也就是说形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定
二者区别:
实参:是一个变量,占用内存空间,数据传送单向,实参传给形参,不能形参传给实参
形参:虚拟的,不占用内存空间,形参变量只有被调用时才分配内存单元

具体应用:
#1、位置参数:按照从左到右的顺序定义的参数
位置形参:必选参数
位置实参:按照位置给形参传值
#2、关键字参数:按照key=value的形式定义的实参
无需按照位置为形参传值
注意的问题:
1. 关键字实参必须在位置实参右面
2. 对同一个形参不能重复传值
#3、默认参数:形参在定义时就已经为其赋值
可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)
注意的问题:
1. 只在定义时赋值一次
2. 默认参数的定义应该在位置形参右面
3. 默认参数通常应该定义成不可变类型
#4、可变长参数:
可变长指的是实参值的个数不固定
而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,*args 没有key值,**kwargs有key值。

实例1:
def test(x,y): #括号里面的就是位置形参
print(‘this x:%s‘ %x)
print(‘this y:%s‘ %y)
test(1,2) #再调用时向函数的位置形参传递的位置实参

实例2:
def foo(x,y): #定义形参
print(x,y)
foo(1,y=2) #这里在调用时1赋值给x这个是位置形参,y=2是关键字参数,那么结果就是打印1和2,如果,如果foo(y=2,1)这样写那么是错误的,因为x是没有值的

实例3:
def foo(x=1,y=2): #在定义函数阶段,已经为形参赋值了,在定义阶段已经赋值,意味着在调用阶段
可以不传值
print(x,y)
foo(x=10) #如果在调用时使用关键字参数或者位置参数,那么实参将覆盖形参

实例4:
*args示例:
def func(x,y,z,*args):
print(x,y,z)
print(args)
func(1,2,3,4,5,6,) #按照位置将实参传递给函数形参,当实参传递的参数溢出,则将剩余的实参传递给*args参数
func(1,2,3,*[4,5,6]) #传递给*args的实参以元组的形式展现
func(*[1,2,3,4,5,6]) #这个传参方式与func(1,2,3,4,5,6,) 一致
func([1,2,3,4,5,6],1,2,3,4) #列表内的数值代表形参的第一位,以此类推

def func(x,y,z):
print(x,y,z)
l=[1,2,3]
func(*l)
#这里实参传递与上述func(*[1,2,3,4,5,6]) 方法一致

**kwargs示例:
def func(x,y,**kwargs):
print(x,y)
print(kwargs)
func(y=2,x=1,z=3,a=1,b=2) #根据关键字参数传递x,y,将形参中没有定义参数都传给**kwargs,并以字典的形式展现
func(1,2,3,z=3,a=1,b=2) #这个调用方式是错误的,这个调用时实参1和2根据位置参数传递给形参,但是实参3没有形参对应
func(y=1,x=2,**{‘a‘:1,‘b‘:2,‘c‘:3}) #这个方法与func(y=2,x=1,z=3,a=1,b=2)结果一致
func(**{‘x‘:1,‘a‘:1,‘b‘:2,‘c‘:3}) #这个调用方法是错误的,该调用方法只是把值传递给**kwargs,而x和y形参则没有值可以传递

def foo(x,y,z):
print(x,y,z)
dic={‘x‘:1,‘y‘:3,‘z‘:1}
foo(**dic)
#foo(x=1,y=3,a=1)

实例5:
def home(name,age,sex):
print(‘from home====>‘,name,age,sex)
def wrapper(*args,**kwargs): #args=(1,2,3,4,5,6,7),kwargs={‘c‘:3,‘b‘:2,‘a‘:1}
home(*args,**kwargs)
#home(*(1,2,3,4,5,6,7),**{‘c‘:3,‘b‘:2,‘a‘:1})
#home(1,2,3,4,5,7,a=1,b=2,c=3)
# wrapper(1,2,3,4,5,6,7,a=1,b=2,c=3)
wrapper(‘egon‘,sex=‘male‘,age=19)


命名关键字参数(了解):
# 形参中,在*后定义的参数称之为命名关键字参数,
# 它的特性是;传值时,必须按照关键字实参的形式传值
# def foo(x,y=20,*args,a=1,b):
# print(x,y,a,b)

# # foo(10,b=3)
# foo(10,22,33,44,a=2,b=3)

# 位置参数,默认参数,*args,命名关键字参数,**kwargs








































































以上是关于调用函数时为啥形参的值不能传给实参的主要内容,如果未能解决你的问题,请参考以下文章

什么是形参和实参?参数传递的方式都有哪些?

函数基础之调用,参数,可变长参数

形参的形参和实参的关系

python基础6-函数的参数

C语言规定,调用一个函数时,实参变量和形参变量之间的数据传递方式是啥

python-形参与实参-01