iamlaosong文
曾经看到这样一个问题,一个字典中的元素是列表,将这个列表元素赋值给一个变量,然后修改这个列表中元素的值,结果发现,字典中那个列表也同样修改了。
那个问题如下:
dict = {'a':[1,2,3,4,5],'b':2} x = dict['a'] for i in range(5): x[i] = 0 print(dict['a'])
程序运行结果如下:
[0, 0, 0, 0, 0]
这儿涉及到Python赋值到底是引用还是拷贝一份的问题,即赋值时是传值还是传址。上面问题是将“a”的值赋给了x出现了上述情况,如果是将“b”的值赋给了x,当我们修改x的值时,字典dict的值并不受影响。
> dict = {'a':[1,2,3,4,5],'b':2} > x = dict['b'] > x 2 > x=x+3 > x 5 > dict {'a': [1, 2, 3, 4, 5], 'b': 2} >
那么问题来了,变量赋值传递时什么情况下是传值(拷贝),什么情况下是传址(引用)呢?
1、直接拷贝
当我们不知道是引用还是拷贝的情况下,可以显式的拷贝。比如字典对象本身都具有拷贝的方法:
x=dict.copy()
没有拷贝方法的对象,也是可以拷贝的。这儿我们引入一个深拷贝的概念,深拷贝——即python的copy模块提供的一个deepcopy方法。深拷贝会完全复制原变量相关的所有数据,在内存中生成一套完全一样的内容,在这个过程中我们对这两个变量中的一个进行任意修改都不会影响其他变量。还是上面的代码,如果改成如下:
import copy dict = {'a':[1,2,3,4,5],'b':2} x = copy.deepcopy(dict['a']) for i in range(5): x[i] = 0 print(dict['a'])
运行结果dict值不受影响。
除了深拷贝,copy模块还提供一个copy方法,称其为浅拷贝,对于简单的对象,深浅拷贝都是一样的,上面的词典对象的copy方法就是浅拷贝。
> dict {'a': [8, 2, 3, 4, 5], 'b': 4} > dd=copy.copy(dict) > dd {'a': [8, 2, 3, 4, 5], 'b': 4} > dd['a'][0]=7 > dd {'a': [7, 2, 3, 4, 5], 'b': 4} > dict {'a': [7, 2, 3, 4, 5], 'b': 4} > ee=dict.copy() > ee {'a': [7, 2, 3, 4, 5], 'b': 4} > ee['a'][0]=9 > ee {'a': [9, 2, 3, 4, 5], 'b': 4} > dict {'a': [9, 2, 3, 4, 5], 'b': 4} > ee['b']=5 > ee {'a': [9, 2, 3, 4, 5], 'b': 5} > dict {'a': [9, 2, 3, 4, 5], 'b': 4} >
浅拷贝时改变第一层次相互不受影响(上例中词典b值的修改),第二层次(上例中词典a的列表值修改)就相互影响了,改一个,其他跟着变。看看id吧:
> id(dict) 20109472 > id(dd) 20244496 > id(ee) 20495072 > id(dd['a']) 20272112 > id(ee['a']) 20272112 > id(dict['a']) 20272112 >
可见词典各个拷贝的id是不同的,但词典a值的id是相同的。如果我们需要真正意义的拷贝,就用深拷贝吧。
2、传递规则
Python赋值过程中不明确区分拷贝和引用,一般对静态变量的传递为拷贝,对动态变量的传递为引用。(注,对静态变量首次传递时也是引用,当需要修改静态变量时,因为静态变量不能改变,所以需要生成一个新的空间存储数据)。
字符串,数值,元组均为静态变量
列表,字典为动态变量。
变量有时比较复杂,存在组合现象,比如字典中包含列表,列表中包含字典,但赋值时,总是属于某个类型。如果实在不清楚状况,可以试验一下,用id()这个函数看看,如果是引用,两个变量指向的地址是相同的。例如:
> a=6 > id(a) 10413476 > b=a > id(b) 10413476 > b=8 > id(b) 10413452 >
修改变量b之前,a和b指向的地址是相同的,修改b后,地址就变了。
以上这篇Python中实现变量赋值传递时的引用和拷贝方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 许巍《许巍精选专辑》[FLAC/分轨][1.9GB]
- 群星.2024-繁花电视剧原声带3CD【环球】【WAV+CUE】
- 江希文.1994-伝说少女(饿狼伝说动画原声大碟)【嘉音】【WAV+CUE】
- 洪荣宏.2010-上爱的人【华特】【WAV+CUE】
- 《大牌国语情歌 经典再现 深情对唱 2CD》[WAV/分轨][900MB]
- 《陈百强粉红色的一生精选 3CD》[FLAC/分轨][1.2GB]
- 《丁当 20首重量级歌曲 Fu Good 下一站天后 2CD》[WAV/分轨][650MB]
- 歌莉雅.2012-My.Voice.Story【环星】【FLAC分轨】
- 群星.1993-一曲成名·青春无悔【飞碟】【WAV+CUE】
- 刘德华.2000-爱无知(金装版)【NEWMELODY】【WAV+CUE】
- 许巍《时光漫步》1CD[FLAC/分轨][804.3MB]
- 群星《2024第一季度百度歌曲排行抖音榜top100》1CD[FLAC/分轨][2.3GB]
- 张柏芝《全新经验》[FLAC/分轨][450MB]
- 唐朝.2008-浪漫骑士【音乐家】【WAV+CUE】
- 张芸京.2016-失败的高歌【泡耳音乐】【WAV+CUE】