淺談Python中的函數傳遞問題

函數參數如何傳遞

key-value方式傳遞參數:

下面是非常常見的傳遞方式,參數名寫直白,寫死瞭:

def show_info(name, title):
    print("姓名為:",name)
    print("職稱為:",title)

我們在使用的時候可以用以下的方式:

show_info('雷學委', '大學生Python學習社區長')
show_info(name='雷學委', title='持續學習協會會長')

可以寫成這樣,使用兩個*,這樣非常靈活,但是缺點也是明顯的(結構靈活有時候需要判斷是否漏傳,直接取容易出錯)

def show_info_v2(**kv_dict):
    print("姓名為:", kv_dict['name'])
    print("職稱為:", kv_dict['title'])
show_info_v2(name='雷學委', title='大學生Python學習社區長')

下面是效果,看起來一樣的。

在這裡插入圖片描述

動態長度參數傳遞

通常使用*加參數名。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/10/24 11:39 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷學委
# @XueWeiTag: CodingDemo
# @File : func_call.py
# @Project : hello
def show_info(name, title):
    print("姓名為:", name)
    print("職稱為:", title)
show_info('雷學委', '大學生Python學習社區區長')
show_info(name='雷學委', title='持續學習協會會長')
def show_info_v2(name, title, *info):
    print("姓名為:", name)
    print("職稱為:", title)
    print("其他評價:", info)
show_info_v2('雷學委', '大學生Python學習社區區長', "熱愛技術", "熱愛生活")

運行效果如下:

在這裡插入圖片描述

參數是否會被函數攥改?

我們看看下面的程序即可:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/10/24 11:39 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷學委
# @XueWeiTag: CodingDemo
# @File : func_call.py
# @Project : hello
def compute_v1(list):
    sum = 0
    for x in list:
        sum += x
    list = list + [sum]
    print("新地址:", id(list))
    return sum
def compute_v2(list):
    sum = 0
    for x in list:
        sum += x
    list[0] = list[0] * 100
    return sum
_list = [1, 2, 3, 4, 5]
print("調用計算函數v1之前:", _list)
print("調用計算函數v1之前內存地址:", id(_list))
print(compute_v1(_list))
print("調用計算函數v1之後:", _list)
print("調用計算函數v1之後內存地址:", id(_list))
_list = [1, 2, 3, 4, 5]
print("調用計算函數v2之前:", _list)
print("調用計算函數v2之前內存地址:", id(_list))
print(compute_v2(_list))
print("調用計算函數v2之後:", _list)
print("調用計算函數v2之後內存地址:", id(_list))

這裡兩個compute函數,一個修改參數引用地址,一個並沒有修改參數引用而是修改瞭引用內存空間的關聯地址(一個變量)的值。

可以說它們都成功瞭。但是外面的_list 的地址是任何時候都不會被修改的,除非賦值新地址(也就是在調用v2之前重新復制那次)

下面是運行結果:

屏幕快照 2021-10-31 下午10.34.46.png

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: