python中函数参数传入为list元素时不改变

本文探讨了Python中函数参数类型对排序问题的影响,特别强调了如何正确处理不可变与可变对象,通过实例和冒泡排序示例解析了change函数的问题,并给出了针对可变对象列表的改进排序方法。
部署运行你感兴趣的模型镜像

在练习python实现数值排序问题时,遇到一个问题如下:
输入n个数,从小到大输出(没用sort方法):
#程序如下

num = str(input('input number:'))
num = num.split()
num =[int(k) for k in num]

def change(a,b):
    a,b = b,a
    return a,b
#冒泡排序
for i in range(len(num)-1):
	for j in range(len(num)-1-i):
		if num[j]>num[j+1]:
			change(num[j],num[j+1])
print(num)
#输入"3 2 1"
#理论输出 :[1,2,3],
#实际结果:[3,2,1],原封不动的输出

经过排查发现问题出在了change函数的参数上,原来python分为可变对象和不可变对象。当函数传入的为不可变对象时,值不会改变;若是可变对象,才会改变。
简单测试如下:

#c函数传入参数为number;为不可变对象
def c(a,b):
    a,b=b,a
    return a,b
m=1
n=2
print(c(m,n))
print(m)
#实际输出:
#(2,1)
#1
#稍作改变:
l=[1,2]
def c(l):
    l[0],l[1]=l[1],l[0]
    return l
print(l)
#结果:[2, 1]

发现传入参数为list(可变对象)时,原输入参数会变。

因此原排序函数可改为如下(为了说明上述原因,其实可不用写change函数):

num = str(input('input number:'))
num = num.split()
num =[int(k) for k in num]

def change(l,n):  #输入l为可变对象list
	l[n],l[n+1]=l[n+1],l[n]
	
#冒泡排序
for i in range(len(num)-1):
	for j in range(len(num)-1-i):
		if num[j]>num[j+1]:
			change(num,j)
print(num)

总结
python函数传入参数时,需要根据自己的原意,输入可变或不可变类型的参数。其分类如下:
不可变(immutable):int、字符串(str)、float、(数值型number)、元组(tuple)、None(空)
可变(mutable):字典型(dictionary)、列表型(list), set(集合)

*菜鸡优快云第一篇文章——勇敢迈出第一步 *

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们正在讨论Python中的函数参数解包。根据引用[1][2][3][5],解包是指使用`*`和`**`运算符将可迭代对象(如列表、元组、字典)中的元素展开为独立的位置参数或关键字参数传递给函数。 引用[1]和[5]重点介绍了位置参数解包(使用*),引用[2]和[3]则同介绍了位置参数解包和关键字参数解包(使用**),以及参数重打包(使用*args和**kwargs)。 用户的问题:如何传递解包的函数参数?即如何在调用函数使用解包操作符。 根据引用,我们可以总结如下: 1. 位置参数解包(*): 将一个序列(列表、元组等)解包成位置参数。 例如:有函数`func(a, b, c)`,若实参是`args = [1, 2, 3]`,则调用`func(*args)`相当于`func(1, 2, 3)`。 2. 关键字参数解包(**): 将一个字典解包成关键字参数。 例如:有函数`func(a, b, c)`,若实参是`kwargs = {'a':1, 'b':2, 'c':3}`,则调用`func(**kwargs)`相当于`func(a=1, b=2, c=3)`。 3. 同使用位置解包和关键字解包: 可以同使用`*`和`**`,但要注意位置参数必须在关键字参数之前。 例如:`func(*args, **kwargs)` 4. 解包要注意参数数量匹配: 位置解包后的参数个数必须与函数定义的位置参数个数匹配(除非函数定义中有可变参数*args)。 关键字解包的字典的键必须与函数定义的参数名匹配(且能包含函数未定义的参数名),除非函数定义中有**kwargs。 5. 参数重打包(在函数定义): 在函数定义中,使用`*args`可以收集任意多个位置参数到一个元组,使用`**kwargs`可以收集任意多个关键字参数到一个字典。 但注意,用户的问题是函数调用的解包,而是定义函数的重打包。 因此,回答将围绕函数调用如何解包参数展开。 另外,引用[4]提到参数传递过程中的内存变化,但主要讲的是默认参数的可变对象问题,与解包关系大,所以这里重点涉及。 步骤: 1. 解释位置参数解包(*)的使用方法和注意事项。 2. 解释关键字参数解包(**)的使用方法和注意事项。 3. 给出同使用两种解包的示例。 4. 说明解包在函数调用中的实际应用场景(如动态参数传递)。 注意:引用[5]中给出了一个使用`range`函数的例子,我们可以借鉴。 根据用户要求,使用中文回答,并按照格式要求添加引用标识。 同,生成相关问题。</think>### Python函数参数解包详解 在Python中,参数解包是通过`*`和`**`运算符将数据结构动态展开为函数参数的技术。根据引用内容,核心方法如下: --- #### 一、位置参数解包(`*`运算符) 将序列(列表/元组)解包为独立的位置参数: ```python def calculate(a, b, c): return a * b + c nums = [3, 4, 2] result = calculate(*nums) # 等价于 calculate(3, 4, 2) [^1][^3][^5] ``` **特点**: - 适用于任意可迭代对象(列表、元组、生成器等) - 元素按顺序匹配位置参数 - **数量必须严格匹配**,否则抛出`TypeError`[^3] **应用场景**: ```python # 动态构建range参数 args = [3, 6] print(list(range(*args))) # 输出 [3, 4, 5][^5] ``` --- #### 二、关键字参数解包(`**`运算符) 将字典解包为独立的关键字参数: ```python def connect(host, port, timeout=10): print(f"连接到 {host}:{port},超={timeout}s") config = {"host": "example.com", "port": 443, "timeout": 30} connect(**config) # 等价于 connect(host="example.com", port=443, timeout=30)[^2] ``` **特点**: - 字典键名必须与函数参数名完全匹配 - 可与位置参数混合使用(位置参数必须在前) - 支持重写默认参数值[^2] --- #### 三、混合解包与重打包 1. **同使用`*`和`**`**: ```python def process(a, b, c, d=0): print(a, b, c, d) args = [1, 2] kwargs = {"c": 3, "d": 4} process(*args, **kwargs) # 输出 1 2 3 4[^2] ``` 2. **函数定义中的重打包**: ```python def log(*args, **kwargs): print("位置参数:", args) # 收集为元组 (1, 2) print("关键字参数:", kwargs) # 收集为字典 {'x':3, 'y':4} log(1, 2, x=3, y=4)[^2] ``` --- #### 四、关键规则与注意事项 1. **顺序强制约束**: ```python # 正确:位置参数 -> 关键字参数 func(*args, **kwargs) # 错误:顺序颠倒会报错 func(**kwargs, *args) # SyntaxError[^1] ``` 2. **匹配规则**: | 解包方式 | 要求 | 错误示例 | |----------|------|----------| | `*iterable` | 元素数 ≥ 位置参数数 | `func(*[1])` → 需3参数 | | `**dict` | 键名必须匹配参数名 | `func(**{"x":1})` → 无x参数 | 3. **避免内存陷阱**: 解包操作创建新对象,但需注意默认参数的可变性(引用[4]的默认列表问题)[^4]。 --- #### 五、实际应用场景 1. **动态调用API**: ```python api_params = get_params_from_db() # 返回字典 call_api(**api_params) ``` 2. **矩阵运算**: ```python points = [(1,2), (3,4), (5,6)] for x, y in points: process_coord(*point) # 解包元组 ``` 3. **配置合并**: ```python base_config = {"timeout": 10} user_config = {"timeout": 30, "retries": 3} final_config = {**base_config, **user_config} # 合并字典 ``` > 通过灵活使用解包技术,可显著提升代码的动态性和可读性[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值