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

导读:本篇文章讲解 Python函数的参数(进阶) – 关于不可变和可变的参数会不会影响到函数外部的实参变量的问题,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

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

答案:不会

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

代码体验:

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


gl_num = 50
demo(gl_num)
print(gl_num)

执行结果:

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

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

def demo(num, num_list):    print("函数内部的代码")    # 在函数内部,针对参数使用赋值语句,不会修改到外部的实参变量    num = 100    num_list = [1, 2, 3]    print(num)    print(num_list)    print("函数代码完成")gl_num = 50gl_list = [10, 20, 30]demo(gl_num, gl_list)print(gl_num)print(gl_list)

执行结果如图:

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

 

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

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

代码体验:

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)

执行结果如图:

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

 

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

执行流程:

代码程序自上而下执行,来到第一行代码,发现函数定义直接向下寻找,来到第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。

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

 

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

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

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

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

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函数的参数(进阶) - 关于不可变和可变的参数会不会影响到函数外部的实参变量的问题

 

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

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函数的参数(进阶) - 关于不可变和可变的参数会不会影响到函数外部的实参变量的问题

 

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73338.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!