news 2026/6/10 4:12:06

Python函数参数报错?PyCharm中新手1招解决实参形参混淆!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python函数参数报错?PyCharm中新手1招解决实参形参混淆!

Python函数报错不断?不少新手都栽在这个坑

不少新手利用 Python 函数写代码时,总是把实参和形参搞混。他们以为传进函数的是一份独立副本。结果,用函数处理数字、字符串做 += 等运算时,函数内部的形参和外部的实参互不影响;可一旦换成列表、字典,在函数内部调用 .pop()、.append() 等方法时,外部的实参却跟着内部的形参一起变了。
新手往往只搜索表面现象——把看到的具体问题输进搜索引擎,比如"Python 函数里修改列表影响外部"。搜索结果分散在各个博客、问答平台,给出的解决方法也各不相同:有的建议用 .copy(),有的要求重新赋值。新手把这些方法都试了一遍,代码却照样出错。对于新手来说,难免怒火中烧,心里有一股火等待着窜出来。对于我来说,我真的很同情新手,明明 Python 函数出了岔子,怎么查、怎么按搜到的办法改都无济于事,这对于谁来说都气愤、焦虑。
其实,新手只要学会一招,就能彻底解决实参和形参的混淆问题,这一招只需要搞懂一个核心概念:“可变对象原地修改 vs 不可变对象重新绑定”。

先别急着写代码,Python函数及其调用、实参形参必须掌握

Python函数是封装好的、可复用的代码块,这能避免新手来回重复写代码,提高程序的可读性和可维护性。
Python函数的语法格式如下。

def函数名(参数1,参数2):"""文档字符串(Docstring):说明函数功能"""# 函数体语句块return返回值# 可选

其中,def是函数定义的关键字。函数名可以随便起,看新手的心情,但最好见名知意,因为这样,别人容易看懂。其中的参数1、参数2等是形参,只在函数内部生效;()是函数的形参列表,可以为空;:是函数头结束的标志。语句块即函数体,是函数具体的执行部分。return用来返回函数的结果(由新手看情况、凭心情自己定义)并结束函数的执行。return返回的函数的结果可以是一个,也可以是多个。return可写可不写,完全看新手的心情和情况。
Python函数的调用是在函数定义好,执行函数。其语法格式如下。

函数名(参数1,参数2,...)

其中,函数名不是随便起的,调用时必须要和定义函数时的函数名一样,否则会出现bug。其中的参数1、参数2等是实参,只在调用函数时生效;()是函数的实参列表,可以为空。
下面我来举一个简单有趣的例子来说明。

# 定义函数:def 是关键字,后面跟函数名,括号里写3个形参(占位变量)defMortgage_free_carefree(name,mortgage,salary):# f-string:字符串前加 f,花括号{}里的变量会被自动替换成传入的值print(f"2026年,{name}的小目标:让{mortgage}万元的房贷像手机电量一样消失,让月薪{salary}元像年龄一样只增不减。至于财富自由,先自由到能全款买杯奶茶再说吧。")# 调用函数:按定义时的顺序,传入3个实参(实际数据)Mortgage_free_carefree("小红","30","10000")

其运行结果如下图所示。

打开PyCharm,2步进入实战模式

在写代码之前,新手必须对PyCharm的安装和使用,以及Python.exe的安装和使用了如指掌。这些都是盖楼时打好的地基,不掌握不行。如果新手不会的话,可以阅读以下两篇文章。
安装Pycharm+配置python.exe:0基础新手一次成功
如何使用PyCharm?0基础新手必看!七大核心功能+越用越有意思

1招解决实参形参混淆的问题

新手在用 Python 函数写代码时,常常被一个困惑死死缠住,既焦虑又烦恼。这个困惑就是:用函数处理数字、字符串,做 +=、-= 等运算时,函数内部的形参和外部的实参互不影响;可一旦换成列表、字典,在函数内部调用 .pop()、.append() 等方法时,外部的实参却跟着内部的形参一起变了。
下面这段代码及其运行结果,能直观说明用函数处理数字、字符串做 +=、-= 等运算时,函数内部的形参和外部的实参互不影响——就仿佛函数形参做了一份副本一样。

# 定义一个函数。括号里的 number 叫做"形参",# 它是函数内部专用的临时变量名,用来接收外部传进来的数据。defnumber_sub(number):# 打印传入时的值。此时函数里的 number 和外部变量指向同一个数字 5。print(f"操作的数字为{number}。")# 【核心知识点】number -= 1 等价于 number = number - 1。# 数字、字符串在 Python 中属于"不可变对象"——它们的值一旦创建就不能原地修改。# 所以这行代码的真实行为是:计算 5-1=4,创建一个"新数字 4",# 然后让函数内部的形参 number 指向这个新数字。# 外部的实参(number_1)仍然指向原来的 5,两者从此互不相干!number-=1# 打印函数内部的结果,此时 number 已经是 4 了。print(f"对数字进行自减一操作的结果为{number}。")# 定义外部变量 number_1(叫做"实参"),值为 5。number_1=5# 调用函数,把 number_1 的值传给形参 number。# 对于数字、字符串做 +=、-= 这类运算时,函数内部的修改只作用于形参,# 外部的实参 number_1 完全不受影响,就像复印了一份文件修改,原件不变。number_sub(number_1)# 打印外部变量,结果仍然是 5,证明函数内部的自减操作没有影响到外面。print(f"当前数字为{number_1}。")


下面这段代码及其运行结果,也能直观说明用函数处理列表、字典等,在函数内部调用 .pop()、.append() 等方法时,外部的实参和内部的形参就像一条线上的蚂蚱,一起变动。

# 定义一个函数,括号里的 fruits 是"形参"(函数内部的临时变量名)。defbuy_fruit(fruits):# 【核心知识点】列表、字典在 Python 中属于"可变对象"。# 调用函数时,实参把"内存地址"传给了形参 fruits,# 此时函数内外的两个变量指向的是"同一个列表"。# .append() 方法是在这个列表的"原地"添加元素,并没有创建新列表,# 所以外部的实参也会跟着一起变化!fruits.append("grapes")# 定义外部列表 fruits(这是"实参"),初始包含一个元素 "apple"。fruits=["apple"]# 打印调用函数前的列表内容。print(f"目前水果列表有{fruits}。")# 调用函数,把外部列表传给函数。# 因为列表是可变的,函数内部用 .append() 往同一个列表里加了 "grapes",# 外部的 fruits 也会看到这个变化。buy_fruit(fruits)# 打印调用函数后的列表内容。你会发现 "grapes" 已经出现在列表里了!print(f"当前水果列表有{fruits}。")


这该怎么办呢?该怎么解决这个问题呢?
新手必须理解 Python 的可变对象和不可变对象。只要理解了这个核心内容,解决上述问题就有希望了,不再像困在沼泽里那样,怎么挣扎都逃不出去。

类型例子特点
不可变对象数字int、字符串str、元组tuple、浮点型数字float值一旦创建就不能改,对这些值做任何修改都是创建一个新值
可变对象列表list、字典dict可以原地修改对象内部的值,对象本身没变
新手不想改变自己已经辛辛苦苦创建的列表 list、字典 dict、集合 set 等可变对象里面的值,怎么办?
我有 3 种方法教给新手。
第一种方法:调用函数时,通过 .copy() 方法对可变对象进行复制。
defbuy_fruit(fruits):fruits.append("grapes")fruits=["apple"]print(f"目前水果列表有{fruits}。")buy_fruit(fruits.copy())#调用函数时,要通过.copy()方法对列表fruits进行复制。print(f"当前水果列表有{fruits}。")


第二种方法:在函数内部通过 .copy() 方法对可变对象进行复制。

defbuy_fruit(fruits):fruits=fruits.copy()#在函数内部通过.copy()方法对列表fruits进行复制。fruits.append("grapes")fruits=["apple"]print(f"目前水果列表有{fruits}。")buy_fruit(fruits)print(f"当前水果列表有{fruits}。")


第三种方法:用 copy.deepcopy() 对可变对象进行深度拷贝,这主要是针对嵌套列表、字典等。

importcopy#导入copydefbuy_fruit(fruits):fruits.append("grapes")fruits=["apple"]print(f"目前水果列表有{fruits}。")buy_fruit(copy.deepcopy(fruits))#对列表fruits进行深拷贝,其结果作为函数buy_fruit的实参print(f"当前水果列表有{fruits}。")

复盘:从本章学到了什么,解决了什么问题

新手读到这,相信你们已经学到了 Python 函数及其调用、实参形参的语法知识,也通过理解 Python 的可变对象和不可变对象,弄清了函数中形参和实参容易混淆的问题——也就是说,当函数处理数字、字符串,做 +=、-= 等运算时,函数内部的形参和外部的实参互不影响;而当函数处理列表、字典,在内部调用 .pop()、.append() 等方法时,外部的实参却会跟着内部的形参一起改变。此外,你们还掌握了三种不改变自己辛苦创建的列表、字典、集合等可变对象内容的方法:调用函数时通过 .copy() 方法复制,在函数内部通过 .copy() 方法复制,以及使用 copy.deepcopy() 进行深度拷贝。
其实你们已经收获很多了,已经很棒、很了不起了,已经超过了绝大多数遇到上述问题还在盲目调试、搜索具体问题的新手,已经能够很快地预防或解决这些问题了。

专栏下篇预告

如果你们觉得我的文章有用、有帮助,写得不错,或者单纯喜欢,请动动你们的金手指,点赞、收藏、转发、关注。
关注我,在本专栏中,下篇我会继续发布关于函数语法知识,以及如何解决利用这些知识写代码的痛点的干货。
如果你们觉得我的文章有问题,请到评论区留言,我看到后会一一改正,直到满足你们的需求为止。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 4:07:59

Rust文件读写详解

[TOC 文件读写 Rust的文件读写功能被封装在标准库的fs中,考虑到读取文件的前提是有一个文件,所以先来学习文件写入功能,示例如下 use std::fs; fs::write("test.txt", "hello world").unwrap();【write】函数非常简单&am…

作者头像 李华
网站建设 2026/6/10 4:04:04

人体姿态估计全维度深度复现 | 上下双范式原理拆解、YOLO26-Pose/ViTPose/RTMPose多模型对标、助力工地安防健身康复动作识别有效提效

目录 一、前言:姿态估计核心价值与行业发展现状 二、姿态估计核心基础:关键点、骨架与技术范式 2.1 行业通用关键点标准 2.2 两大核心技术范式深度对比 2.2.1 自上而下范式(工业量产主流) 2.2.2 自下而上范式(高密度场景专用) 2.3 关键点预测两大核心机制 2.3.1 …

作者头像 李华
网站建设 2026/6/10 4:04:01

DFT笔记67

7.2.3.2 Two-Phase Strategy(两阶段诊断策略) 针对上面提到的这个问题,可以用这节的两阶段策略来解决,这两阶段就是: 第一阶段,找到prime candidate,就是在partitioning之前先找到structurally independent faults 第二阶段,把第一阶段找到的prime candidates排除后,…

作者头像 李华
网站建设 2026/6/10 3:45:43

CODESYS平台 符号配置里面找不到全局变量怎么办?

一、问题点CODESYS平台符号配置用于访问PLC变量的机制,允许通过符号名称(变量名)进行数据采集和交互。在CODESYS平台明明已添加全局变量,却在符号配置,符号列表里找不到在,这给后续PLC与第三方软件例如PLC-…

作者头像 李华
网站建设 2026/6/10 3:45:37

金刚石NV色心量子传感:北睿科技高灵敏度磁场探测方案

金刚石NV色心量子传感概述金刚石NV色心量子传感是一种利用金刚石中氮-空位(NV)色心的量子特性来实现高灵敏度磁场探测的技术。北睿科技基于此原理,开发了可在室温下工作的高精度磁场探测方案,灵敏度可达皮特斯拉级别,应…

作者头像 李华