当前位置:首页>python>第三十一课:Python函数的值传递和引用传递

第三十一课:Python函数的值传递和引用传递

  • 2026-10-18 10:43:46
第三十一课:Python函数的值传递和引用传递
Python中函数的参数传递机制都是“值传递”。所谓值传递,就是将实际参数的副本(复制品)传入函数,而参数本身不会受到任何影响。看例子:
def swap(a , b) :    # 下面代码实现a、b变量的值交换    a, b = b, a    print("swap函数里,a的值是",a, ";b的值是", b)a = 6b = 9swap(a , b)print("交换结束后,变量a的值是",a , ";变量b的值是", b)

执行过程(按值传递理解):

  1. 主程序中定义变量:
    • a = 6
    • b = 9
  2. 调用swap(a, b)时:
    • 系统把当前 a 的值(6)和 b 的值(9)复制一份,传给函数swap
      的两个参数。
    • 也就是说,函数内部的a
      和b是新的局部变量,初始值分别是 6 和 9。
    • 这个过程就是值传递:实参的值被复制给形参,函数内部操作的是副本。
  3. 在swap函数内部执行 a, b = b, a:
    • 把函数内部的
      a和 b 的值互换。
    • 此时函数内的
      a变成 9,b 变成 6。
    • 打印输出:swap函数里,a的值是 9 ;b的值是 6
  4. 函数执行结束,返回主程序:
    • 函数内部的
      a和b是局部变量,随着函数结束而消失。
    • 主程序中的原始变量
      a和 b从未被修改,仍然保持原来的值:6 和 9。
    • 所以最后一行输出:交换结束后,变量a的值是 6 ;变量b的值是 9
    值传递实质:实参的值被复制给形参,函数内部对形参的任何修改都不会影响主程序中的原始变量。传的是值的副本,不是原始变量本身。接下来是引用传递:
    def swap(dw):    # 下面代码实现dw的a、b两个元素的值交换    dw['a'], dw['b'] = dw['b'], dw['a']    print("swap函数里,a元素的值是",dw['a'], ";b元素的值是", dw['b'])    # 把dw直接赋值为None,让它不再指向任何对象    dw = Nonedw = {'a': 6, 'b': 9}swap(dw)print("交换结束后,a元素的值是",dw['a'], ";b元素的值是", dw['b'])

    第一步:主程序创建字典

    • dw = {'a': 6, 'b': 9}
    → 创建了一个字典,包含两个键值对。

    第二步:调用 swap(dw)

    • 把 dw传给函数参数 dw。
    • 在 Python 中,字典是可变类型,当它作为参数传入函数时,函数内部的参数 dw 和主程序中的 dw指向同一个字典。
    • 这种行为看起来像“引用传递”:函数内对字典内容的修改,会直接反映到主程序中。
    第三步:在函数内交换字典的值
    dw['a'], dw['b'] = dw['b'], dw['a']
    • 这行代码修改了字典内部的数据:
      • 原来
        'a': 6, 'b': 9
      • 现在变成
        'a': 9, 'b': 6
    • 因为函数内的 dw
       和主程序的 dw指向同一个字典,所以这个修改是全局生效的。
    • 打印输出
      :swap函数里,a元素的值是 9 ;b元素的值是 6

    第四步:dw = None

    • 这行代码只是让函数内部的局部变量dw
      不再指向原来的字典,而是指向 None。
    • 这不会影响主程序中的dw
    • 主程序中的 dw
      仍然指向那个已经被修改过的字典{'a': 9, 'b': 6}。

    第五步:函数返回,执行主程序打印

    print("交换结束后,a元素的值是", dw['a'], ";b元素的值是", dw['b'])
    • 主程序的dw
      仍然是那个字典,且内容已被交换。
    • 所以输出:交换结束后,a元素的值是 9 ;b元素的值是 6

    最新文章

    随机文章