文档章节

Python学习(七)——可变与不可变参数

断桥残雪断桥残雪
 断桥残雪断桥残雪
发布于 2015/09/21 13:10
字数 577
阅读 450
收藏 1

下面一段代码演示了可变与不可变默认参数的区别,通过查看内存地址以及每次函数调用之后的默认参数的变化,可以看出两段代码为什么会产生不同的结果。

# -*- coding: cp936 -*- 
# 上面一句是为了中文编码问题
# 默认值只被赋值一次。这使得当默认值是可变对象时会有所不同,比如列表、字典或者大多数类的实例。
# 例如,下面的函数在后续调用过程中会累积(前面)传给它的参数

def f(a,L=[]):
	print('默认参数地址为:'+str(id(L)))
	L.append(a)
	print('改变后的参数地址为:'+str(id(L)))
	return L

# 如果不想参数累积,可以如下定义
def f1(a,L1=None):
	print('默认参数地址为:'+str(id(L1)))
	if L1 is None:
		L1=[]
	L1.append(a)
	print('改变后参数地址为:'+str(id(L1)))
	return L1

# python中是引用赋值,list/dict均为可变类型,字符串/tuple为不可变类型
#下面可以看看这两段代码有什么不同
# f测试	
print(f(1))
print('函数f的默认参数为'+str(f.__defaults__))
print(f(2))
print('函数f的默认参数为'+str(f.__defaults__))
print(f(3))
print('函数f的默认参数为'+str(f.__defaults__))

# f1测试
print(f1(1))
print('函数f1的默认参数为'+str(f1.__defaults__))
print(f1(2))
print('函数f1的默认参数为'+str(f1.__defaults__))
print(f1(3))
print('函数f1的默认参数为'+str(f1.__defaults__))

运行结果:

C:\Users\zzw922cn\Desktop>python 1.py
默认参数地址为:56716224
改变后的参数地址为:56716224
[1]
函数f的默认参数为([1],)
默认参数地址为:56716224
改变后的参数地址为:56716224
[1, 2]
函数f的默认参数为([1, 2],)
默认参数地址为:56716224
改变后的参数地址为:56716224
[1, 2, 3]
函数f的默认参数为([1, 2, 3],)
默认参数地址为:1525627488
改变后参数地址为:56738440
[1]
函数f1的默认参数为(None,)
默认参数地址为:1525627488
改变后参数地址为:56738440
[2]
函数f1的默认参数为(None,)
默认参数地址为:1525627488
改变后参数地址为:56738440
[3]
函数f1的默认参数为(None,)


© 著作权归作者所有

断桥残雪断桥残雪
粉丝 53
博文 139
码字总数 94909
作品 0
广州
程序员
私信 提问
探索 Python 之 变量、类型和引用

在探索到 Python 函数的参数传递的时候,我不禁赞叹 Python 灵活的参数设计,但慢慢的,开始迷惑与传递参数的修改和返回。 众所周知,在 C++ 中传递参数分为传值和传引用两种,但 Python 没有...

charlesdong1989
2012/03/29
768
2
12道必会的Python面试题,附详细讲解

无论是应聘Python方向的web开发,还是爬虫工程师,或是数据分析,还是自动化运维,都涉及到一些基础的知识!小编挑了一些Python的基础面试题,看看你能不能的答上来,也许面试的同学用的着!...

诸葛玥
2018/06/16
0
0
Python 程序员如何防止数据被修改?

作者 | PayneLi 责编 | 郭芮 程序员转行学什么语言? https://edu.csdn.net/topic/ai30?utmsource=csdnbw 在平时工作中,经常涉及到数据的传递。在数据传递使用过程中,可能会发生数据被修改...

CSDN资讯
03/07
0
0
Python 函数式编程:不可变数据结构

不可变性可以帮助我们更好地理解我们的代码。下面我将讲述如何在不牺牲性能的条件下来实现它。 在这个由两篇文章构成的系列中,我将讨论如何将函数式编程方法论中的思想引入至 Python 中,来...

作者: Moshe Zadka
2018/11/11
0
0
轻松初探 Python 篇(六)— 函数

这是「AI 学习之路」的第 6 篇,「Python 学习」的第 6 篇 小之的公众号 : WeaponZhi 题外话 这周工作日 5 天,我并没有更新文章,但大家并不要以为小之懒惰了。正好相反,自从上篇的 AI 入门...

WeaponZhi
2018/10/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部