函数传参时,默认参数为变量容易出现的问题

在定义函数时使用默认参数的时候,如果默认参数是变量的话,需要注意一下坑。

 1 # This Python file uses the following encoding: utf-8
 2
 3 def add_end(l = []):
 4     l.append(‘end‘)
 5     print(id(l), l)
 6
 7 if __name__ == ‘__main__‘:
 8     add_end()
 9     add_end()
10
11 输出:
12 2510338155080 [‘end‘]
13 2510338155080 [‘end‘, ‘end‘]

当函数被定义的时候,默认参数"l"就已经被计算出来了,指向地址为2510338155080的list"[]",无论被调用多少次,这个函数的默认参数

都是指向的这个地址。如果这地址放的是一个变量,那么这个函数被定义过后,这默认参数的值可能会发生变化,代码规范提示原文:

Default argument value is mutable

This inspection detects when a mutable value as list or dictionary is detected in a default value for an argument.

Default argument values are evaluated only once at function definition time,which means that modifying the default value of the argument will affect all subsequent

calls of the function.

所以刚才的代码可以优化成这样:

# This Python file uses the following encoding: utf-8

def add_end(l = None):
    print(id(l))
    if l is None:
        l = []
        l.append(‘end‘)
    print(id(l), l)

if __name__ == ‘__main__‘:
    add_end()
    add_end()

输出:
140734702120160
2314661225032 [‘end‘]
140734702120160
2314661225032 [‘end‘]

原文地址:https://www.cnblogs.com/renxchen/p/9816660.html

时间: 2024-10-06 11:54:47

函数传参时,默认参数为变量容易出现的问题的相关文章

小程序函数传参时{}的作用

在前台wxml的标签中bind绑定后台方法并传参时,正常情况时如下所示: ondata  (e) { console.log(e) }, 这样输出的是所有的属性结果 如果想要输出的是自己想要的结果,就需要这样: 如:想要 e 中的 detail 属性值: ondata  ({detail}) { console.log(detail) }, 这样只需包裹在 {} 中就可以了,输出的结果就只是你想要的 detail 结果 原文地址:https://www.cnblogs.com/Z_66/p/12

在传参时,url参数中包含+、空格、=、%、&、#等特殊符号的处理

url参数中有+.空格.=.%.&.#等特殊符号的问题解决? 解决办法: 将这些字符转化成服务器可以识别的字符,对应关系如下: URL字符转义 +    URL 中+号表示空格                      %2B 空格 URL中的空格可以用+号或者编码           %20 /   分隔目录和子目录                        %2F ?    分隔实际的URL和参数                    %3F %    指定特殊字符           

PHP输出javascript脚本,带php参数,函数传参字符串并带有变量

1.在php中,有的时候我们需要echo出js脚本,并且这个脚本里带有php设置的变量 怎么输出,有点讲究,记下来备用.方法如下: (1)第一种方法 <?php $_hg = 'hong'; echo '<script type="text/javascript">alert("我的名字是'.$_hg.'");history.back();</script>'; ?> (2)第二种方法,实施改变单引号,双引号的引用 <?ph

JS——变量和函数的预解析、匿名函数、函数传参、return

JS解析过程分为两个阶段:编译阶段.执行阶段.在编译阶段会将函数function的声明和定义都提前,而将变量var的声明提前,并将var定义的变量赋值为undefined. 匿名函数: window.onload = function () { var oBtn01 = document.getElementById('btn01'); var oBtn02 = document.getElementById('btn02'); //注意这里不能有括号,skin01()的话就立刻执行了哦,所以不

python 函数传参练习 全局变量与局部变量 的理解

额 还是继续抄一边NLP第二条: 2.一个人不能控制另外一个人   一个人不能改变另外一个人,一个人只能改变自己. 每个人的信念,价值观,规条系统只对本人有效,不应强求别人接守. 改变自己,别人才会有可能改变. 一个人不能推动另外一个人,每个人都只可以自己推动自己. 找出对方的价值观,创造,增大或转移对方在乎的价值,对方便会产生推动自己的行为. 一个人因此不能“教导”另外一个人,一个人只能引导另外一个人取学习. 因此一个人不能希望另外一个人放弃自己的一套信念,价值观和规条系统,而去接受另外的一套

关于函数传参--传指针,传引用

今天和同学讨论到指针和引用的传递问题,有些想法从推理上讲是正确的,但是因为是推理,说出自己观点的时候不是那么有底气,本着实践是检验真理的唯一标准的原则,在电脑上敲了几段代码,验证了推理的正确性. 先上代码,再分析. 代码1: void Swap0(int a1,int b1){ int temp; temp=a1; a1=b1; b1=temp; } void Swap1(int *a1,int *b1){ //交换地址 int *temp; temp=a1; a1=b1; b1=a1; } v

[Java]_函数传参的疑惑与思考

问题来源于leetcode上的两道题 Path Sum I && II,分别写了两个dfs. 1 void dfs(TreeNode node , int sum , ArrayList<Integer> curPath) 2 void dfs(TreeNode node , int sum , boolean ifExist) 问题:在1号中我可以在方法中修改curPath,在结束函数调用时,变量修改仍然生效.   在2号问题中,我即使在函数中修改了ifExist,结束函数调

python函数传参是传值还是传引用?

首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. 引用传递(pass-

Date对象,封闭空间,函数传参和封装,获取非行间样式,字符串操作

一.Date对象 1. 获取 oDate.getFullYear() 获取年份 oDate.getMonth()+1  获取月份( 0-11)----->1-12 oDate.getDate()  获取日 1-31 oDate.getHours() 获取小时 oDate.getMinutes() 获取分 oDate.getSeconds() 获取秒 oDate.getMilliseconds();   //毫秒 oDate.getDay() 获取星期几 0-6     0:星期天 例:数码时钟