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

2次阅读

共计 2012 个字符,预计需要花费 6 分钟才能阅读完成。

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

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

答案:不会

无论传递的参数是可变还是不可变,只有针对参数应用赋值语句,会在函数外部批改局部变量的援用,不会影响到内部变量的援用。

代码体验:

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


gl_num = 50
demo(gl_num)
print(gl_num)

执行后果:

减少可变类型的参数代码体验:

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)

执行后果如图:

二、在函数外部,应用办法批改可变参数,会影响内部实参

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

代码体验:

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 办法会把另外一个列表的内容整合到以后的列表当中。

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

def demo(num):
    print("函数开始")
    # num=num+num
    # 实质上是进行相加的操作,等号右边的 num 和等号左边的 num 进行相加,相加的后果再赋值给等号的左侧 num
    num += num
    print(num)
    print("函数实现")


gl_num = 10
demo(gl_num)
print(gl_num)

执行后果:

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

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 基础教程查看学习。

文章借鉴起源:www.wakey.com.cn/document-column-python.html

正文完
 0