Python Memo 赋值与ID (Assignment & id())
利用Python内置函数id()找出内部地址,探讨赋值与内建地址。
id()的官方解释:this is the address of the object in memory
那么 a =1 是什么意思?
>>> id(1)
1539072224
>>>
=============================== RESTART: Shell ===============================
>>> id(1)
1539072224
int 1 的id为 1539072224,restart后,不变,即为恒定。
>>> a=1
>>> b=1
>>> id(a)==id(b)
True
>>> id(a)==id(1)
True
① 对于int来说,a=1, b=1, a与b与1 同地址。1只有一个恒定地址,重启不变。
a=[1,2] 是什么意思?
>>> id([1,2])
2652678637128
>>>
=============================== RESTART: Shell ===============================
>>> id([1,2])
2491240771400
>>> id(1)
1539072224
>>> id([1,2])
2491241012296
对于list,同值在每次赋值时不同地址。(tuple经测试也是一样)
>>> x=[1,2]
>>> y=x
>>> id(x)-id(y)
0
>>> id(x)-id([1,2])
-65344
=============================== RESTART: Shell ===============================
>>> x=[1,2]
>>> y=[1,2]
>>> id(x)-id(y)
-156672
② 对于tuple,list,x=[1,2], y=[1,2],x,y,[1,2]的地址均不同。
③对于tuple,list,x=[1,2], y=x , x,y的地址相同。
既是说:
>>> x=[1,2]
>>> y=x
>>> x.append(1) #list可变,tuple不可变
>>> y
[1, 2, 1]
字典中的copy: 浅复制与深复制到底有什么差别
=============================== RESTART: Shell ===============================
>>> x={1:'qwe',2:['asd','zxc']}
>>> y=x
>>> id(y)-id(x)
0
>>> id(y[2])-id(x[2])
0
>>> y=x.copy()
>>> id(y)-id(x)
521056
>>> id(y[2])-id(x[2])
0
>>> from copy import deepcopy
>>> y=deepcopy(x)
>>> id(y)-id(x)
72
>>> id(y[2])-id(x[2])
192
字典不同复制方式:
>>> x={1:'qwe',2:['asd','zxc']}
>>> y=x
>>> y[3]='f' # y=x, id(y) - id(x) == 0 , id(y[2])-id(x[2]) == 0
>>> x
{1: 'qwe', 2: ['asd', 'zxc'], 3: 'f'} #①:y=x,y,x同地址,y[3]=['f'] 同时会改变x
>>> y=x.copy()
>>> y[4]='f'
>>> x
{1: 'qwe', 2: ['asd', 'zxc'], 3: 'f'}
>>> y
{1: 'qwe', 2: ['asd', 'zxc'], 3: 'f', 4: 'f'} # y=x.copy(), id(y) - id(x) != 0 , id(y[2])-id(x[2]) == 0
>>> y[2].append('a')
>>> x
{1: 'qwe', 2: ['asd', 'zxc', 'a'], 3: 'f'} #②:y=x.copy(),y,x不同地址,但y[2],x[2]同地址。y.append('f')同时会改变x
>>> from copy import deepcopy
>>> y=deepcopy(x)
>>> y[4]='f'
>>> x
{1: 'qwe', 2: ['asd', 'zxc', 'a'], 3: 'f'}
>>> y
{1: 'qwe', 2: ['asd', 'zxc', 'a'], 3: 'f', 4: 'f'} # y=deepcopy(x), id(y) - id(x) != 0 , id(y[2])-id(x[2]) != 0
>>> y[2].append('a')
>>> x
{1: 'qwe', 2: ['asd', 'zxc', 'a'], 3: 'f'}
>>> y
{1: 'qwe', 2: ['asd', 'zxc', 'a', 'a'], 3: 'f', 4: 'f'} #③:y=deepcopy(x),y,x不同地址,y[2],x[2]不同地址。y.append('f')不会改变x
即: y=x , 赋予同一个地址,dict y的增添方法(赋值)会同样改变x。
y=x.copy() 浅复制,y被赋予了不同地址,dict 的增添方法不会改变x,但是,dict 中所包含的tuple 是同地址,tuple的增添方法append会改变x。
y=deepcopy(x)深复制,连同其内的tuple都被赋予不同地址,tuple的增添方法append不会改变x。
Python Memo 赋值与ID (Assignment & id())的更多相关文章
- 关于python中赋值、浅拷贝、深拷贝之间区别的深入分析
当重新学习了计算机基础课程<数据结构和算法分析>后再来看这篇自己以前写的博文,发现错误百出.python内置数据类型之所以会有这些特性,归根结底是它采用的是传递内存地址的方式,而不是传递真 ...
- python的赋值
python的赋值其实就是引用,我们用python的id函数看一下: 然而令人蛋疼的事情发生了, 为什么会给一个新的c赋值1,它与上面的a和b的id一样呢. 原来是python会认为一些小的整形会经常 ...
- 如何理解 Python 的赋值逻辑
摘要: 如果你学过 C 语言,那么当你初见 Python 时可能会觉得 Python 的赋值方式略有诡异:好像差不多,但又好像哪里有点不太对劲. 本文比较并解释了这种赋值逻辑上的差异.回答了为什么需要 ...
- 图解python中赋值、浅拷贝、深拷贝的区别
Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果.下面本文就通过简单的例子介绍一下这些概念之间的差别. 对象赋值 直接看一段代码: will = ...
- 深入理解Python中赋值、深拷贝(deepcopy)、浅拷贝(copy)
赋值 python跟java中的变量本质是不一样的,Python的变量实质上是一个指针(int型或str型),而java的变量是一个可操作的存储空间. a = 123b = a print(id(a) ...
- python中赋值、浅拷贝、深拷贝详解(转)
一.赋值 >>> a = [1, 2, 3]>>> b = a>>> print(id(a), id(b), sep='\n')139701469 ...
- python 之 赋值和拷贝(你真的了解吗)
现象:先上一段代码. >>> import copy >>> a = [1,2,3,4,['a','b']] >>> b = a >> ...
- python中赋值和浅拷贝与深拷贝
初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...
- [Python] 等号赋值, copy, deepcopy的区别
参考链接: 1. 介绍python中的可变类型与不可变类型:https://blog.csdn.net/answer3lin/article/details/86430074 (也可以参考转载博客 P ...
随机推荐
- 100-days: twenty-eight
Title: Lawrence Ferlinghetti's(劳伦斯·费林盖蒂) enduring San Francisco(旧金山) 劳伦斯·费林盖蒂心中的旧金山,历久弥新 费林盖蒂:美国垮掉的一 ...
- springmvc接收ajax传递的数组
之前的方法我用字符串拼接.req.getParameter("参数名[]");或json方式.虽然都能用,但是都不太令我满意. 今天参考这个贴子,ajax添加 traditiona ...
- Flask-WTForms 简单使用
安装 wtforms 2.2.1 直接上代码: app.py 文件: from flask import Flask, render_template, request from wtforms im ...
- ios UITableView的style的区别与用法,以及分割线的显示与隐藏
******************tableview style****************************************************** // tableview ...
- crm开发之用户重置密码
重置 密码这这功能. 我是没有在,stark组件中. 内置的.所以需要,自己进行定制.也就只是,在已有的增删改查的基础上,再增加一条url 和相对应的 视图函数. 好的是, 我已经预留了,增加的接 ...
- 微信小程序登录流程
小程序登录流程 参考 app.js需要做的 1,首先通过wx.login()拿到code,成功之后,发送数据,请求接口,把code发送给后端,换区openid,sessionKey,unionId,把 ...
- Linux驱动之触摸屏程序编写
本篇博客分以下几部分讲解 1.介绍电阻式触摸屏的原理 2.介绍触摸屏驱动的框架(输入子系统) 3.介绍程序用到的结构体 4.介绍程序用到的函数 5.编写程序 6.测试程序 1.介绍电阻式触摸屏的原理 ...
- java用POI操作excel——随便写一下,最基础的东西
前两天部门实施在做一个东西,需要把客户放在Excel中的数据导入到Oracle数据库中,我就想着直接写一个模板,必要的时候改一下实体类应该可以解放实施同事的双手,不过在实际写的过程中,还是碰到很多问题 ...
- CSS网页布局
注:优化样式表:增加css样式表的可读性 减伤样式重复 一.主要内容 1.布局分类;131 121 2.display属性排版 3.float属性排版(横向多列布局) 4.防止父类盒子塌陷 二.标 ...
- PowerDesigner code、name显示设置 及 同时显示办法
菜单->Tool->Model Options->Name Convention->右侧display中选择显示name还是code. 不支持同时显示,但可以选择显示code, ...