前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python函数的参数(进阶) - 关于不可变和可变的参数会不会影响到函数外部的实参变量的问题

Python函数的参数(进阶) - 关于不可变和可变的参数会不会影响到函数外部的实参变量的问题

原创
作者头像
python自学网
发布2022-06-08 15:03:21
1.6K096
代码可运行
发布2022-06-08 15:03:21
举报
文章被收录于专栏:python+前端 知识分享
运行总次数:96
代码可运行

一、在函数内部,针对参数使用赋值语句,不会修改到外部的实参变量

问题:在函数内部,针对参数使用赋值语句,会不会影响调用函数时传递的实参变量?

答案:不会

无论传递的参数是可变还是不可变,只要针对参数使用赋值语句,会在函数内部修改局部变量的引用不会影响到外部变量的引用

代码体验:

代码语言:python
代码运行次数:43
复制
def demo(num):
    print("函数内部的代码")
    #  在函数内部,针对参数使用赋值语句,不会修改到外部的实参变量
    num = 100
    print(num)
    print("函数代码完成")


gl_num = 50
demo(gl_num)
print(gl_num)

执行结果:

增加可变类型的参数代码体验:

代码语言:python
代码运行次数:5
复制
def demo(num, num_list):
    print("函数内部的代码")

    # 在函数内部,针对参数使用赋值语句,不会修改到外部的实参变量
    num = 100
    num_list = [1, 2, 3]

    print(num)
    print(num_list)

    print("函数代码完成")


gl_num = 50
gl_list = [10, 20, 30]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)

执行结果如图:

二、在函数内部,使用方法修改可变参数,会影响外部实参

问题:如果传递的参数是可变类型,在函数内部,使用方法修改了数据的内容,同样会影响到外部的数据

代码体验:

代码语言:python
代码运行次数:37
复制
def demo(num_list):
    print("函数内部的代码")
    # num_list = [10, 20, 30]
    # 使用方法修改列表的内容
    num_list.append(40)  # num_list = [10, 20, 30, 40]
    print(num_list)

    print("函数代码完成")


gl_list = [10, 20, 30]
demo(gl_list)
print(gl_list)

执行结果如图:

自己可以尝试一下按照代码演练一下代码执行的顺序,就可以知道是如何改变的了。这里简单的叙述一下以上代码的执行流程。

执行流程:

代码程序自上而下执行,来到第一行代码,发现函数定义直接向下寻找,来到第11行,这行定义了一个列表,列表等号右边中保存了数据10,20,30,等号左边用一个变量gl_list来记录这个列表,第11行代码完成之后继续向下执行来到第12行,第12行是函数的调用,调用函数的时候把全局变量gl_list的引用传递到函数内部,来到第1行代码,传递到函数内部Python的解释器会在函数内部再定义一个叫num_list的局部变量,让这个局部变量同样引用了外部的10,20,30列表。此时,在函数内部继续向下执行来到第5行,关键时刻到了,在第5行并没有使用过赋值语句,只是让num_list调用了append()这个方法,而调用append()方法并不会修改这个10,20,30列表的引用,只是会在列表的末尾再追加一个数字40,追加完成我们在打印这个列表时就可以看到是10,20,30,40,同时当函数执行完成返回到主程序中在代码第13行输出全局列表时,gl_list现在指向的列表内容是10,20,30,40,所以最后打印的是10,20,30,40。

三、列表使用+=,本质上是调用extend方法,不会修改变量的引用

在python中,列表变量调用+=,本质上是在执行列表变量的extend方法,不会修改变量的引用。

extend方法会把另外一个列表的内容整合到当前的列表当中。

代码示例:(数字使用+=)

代码语言:python
代码运行次数:2
复制
def demo(num):
    print("函数开始")
    # num=num+num
    # 本质上是进行相加的操作,等号左边的num和等号右边的num进行相加,相加的结果再赋值给等号的左侧num
    num += num
    print(num)
    print("函数完成")


gl_num = 10
demo(gl_num)
print(gl_num)

执行结果:

代码示例:(列表使用+=)

代码语言:python
代码运行次数:9
复制
def demo(num, num_list):
    print("函数开始")
    # num=num+num
    num += num
    # 列表变量使用+=不会坐相加再赋值的操作
    # num_list=num_list+num_list
    # 本质上是在调用列表的extend方法
    num_list += num_list
    # num_list.extend(num_list)
    print(num)
    print(num_list)
    print("函数完成")


gl_num = 10
gl_list = [1, 2, 3]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)

执行结果:

以上罗列的三个方面就是关于函数的参数进阶部分,关于不可变和可变的参数会不会影响到函数外部的实参变量的问题就介绍到这里吧,有不理解的可以去找其他的关于这方面呢的Python基础教程查看学习。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、在函数内部,针对参数使用赋值语句,不会修改到外部的实参变量
  • 二、在函数内部,使用方法修改可变参数,会影响外部实参
  • 三、列表使用+=,本质上是调用extend方法,不会修改变量的引用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档