Python增强赋值和共享引用注意事项小结
概述
Python中的增强赋值是从C语言中借鉴出来的,所以这些格式的用法大多和C一致,本身就是对表达式的简写,即二元表达式和赋值语句的结合,比如a += b 和a = a + b 就是一致的,比如还有以下的增强赋值语句。
- | - | - | - |
---|---|---|---|
a += b | a &= b | a -= b | a |= b |
a *= b | a ^= b | a /= b | a >>=b |
a %= b | a <<= b | a **= b | a //=b |
即增强赋值语句适用于任何支持隐式二元表达式的类型,比如“+”的多态:数字的相加和字符串的合并
数字加减
a = 1 a = a + 1 print(str(a)) a += 1 print(str(a))
示例结果:
2
3
字符串合并
S = 'I' S = S + ' like ' print(S) S += 'Python.' print(S)
示例结果:
I like
I like Python.
优点
- 简洁
- 减少一次a的执行,执行速度更快
- 针对可变对象,增强赋值会自动选择执行原处的修改运算,而不是速度更慢的复制。这就引申出我们在可变对象中可能涉及的共享引用问题。
共享引用
当我们想要扩展列表时,比如将一组元素添加到末尾,我们会怎么做?
L = [1, 2, 3] # 传统“+”法 L = L + [4, 5] print(L) # 利用列表方法extend L.extend([6, 7]) print(L)
示例结果
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6, 7]
示例中第一中“+”法,即采用合并的方法,需要新创建一个对象把左侧的L复制到新列表中,然后再[4, 5]复制到新列表中。而第二种extend则是直接在内存空间列表L末尾L加上[4, 5],即速度会更快,增强赋值则是自动采用的第二种即L.extend([6, 7])和L += [6, 7]是等价的,也是最优的选择。这种合并方式虽然快,但对于可变对象的共享引用则会变的棘手些。
L1 = [1, 2, 3] L2 = L1 L2 = L2 + [4, 5] print(L2) print(L1) print('-' * 21) L1 = [1, 2, 3] L2 = L1 L2 += [4, 5] print(L2) print(L1)
示例结果:
[1, 2, 3, 4, 5]
[1, 2, 3]
---------------------
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
我们可以从示例中看到如果同一个可变对象赋值了多个变量,那么在破坏共享引用结构时,就应该对可变对象拷贝后在进行操作。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。
相关推荐
-
Python赋值语句后逗号的作用分析
本文实例讲述了Python赋值语句后逗号的作用.分享给大家供大家参考.具体分析如下: IDLE 2.6.2 >>> a = 1 >>> b = 2, >>> print type(a) <type 'int'> >>> print type(b) <type 'tuple'> >>> c = [] >>> d = [], >>> print type(c)
-
Python3多目标赋值及共享引用注意事项
Python中多目标赋值即将等号左边所有的变量名都赋值给右边的对象,完成赋值操作,比如将三个变量同时赋值给一个字符串. a = b = c = 'Python' print(a) print(b) print(c) 示例结果: Python Python Python 在多目标赋值中,其本质即类似三个变量的指针指向了同一个内存空间,即三个变量共享了内存内同一对象. 不可变对象 对于不可变对象来说,我们在使用这些变量是不存在问题的. a = b = c = 'Python' print(a) pr
-
python dict 字典 以及 赋值 引用的一些实例(详解)
最近在做一个很大的数据库方面的东东,要用到根据数值来查找,于是想到了python中的字典,平时没用过dict这个东东 用的最多的还是 list 和 tuple (网上查 用法一大堆) 看了一下创建字典的方法: 方法1: dict = {'name': 'earth', 'port': 80} 方法2: fdict = dict((['x', 1], ['y', 2])) 方法3: ddict = {}.fromkeys(('x', 'y'), -1) 都实验了一下这些方法,发现不好用,做不出来自
-
python实现同时给多个变量赋值的方法
本文实例讲述了python实现同时给多个变量赋值的方法.分享给大家供大家参考.具体分析如下: python中可以同时给多个变量赋值,下面列举了三种方法 # Assign values directly a, b = 0, 1 assert a == 0 assert b == 1 # Assign values from a list (r,g,b) = ["Red","Green","Blue"] assert r == "Red&q
-
Python中的赋值、浅拷贝、深拷贝介绍
和很多语言一样,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式. 在学习过程中,一开始对浅拷贝理解很模糊.不过经过一系列的实验后,我发现对这三者的概念有了进一步的了解. 一.赋值 赋值算是这三种操作中最常见的了,我们通过一些例子来分析下赋值操作: str例 复制代码 代码如下: >>> a = 'hello' >>> b = 'hello' >>> c = a >>> [id(x) for x in
-
深入理解Python中变量赋值的问题
前言 在Python中变量名规则与其他大多数高级语言一样,都是受C语言影响的,另外变量名是大小写敏感的. Python是动态类型语言,也就是说不需要预先声明变量类型,变量的类型和值在赋值那一刻被初始化,下面详细介绍了Python的变量赋值问题,一起来学习学习吧. 我们先看一下如下代码: c = {} def foo(): f = dict(zip(list("abcd"), [1, 2 ,3 ,4])) c.update(f) if __name__ == "__main__
-
跟老齐学Python之赋值,简单也不简单
变量命名 在<初识永远强大的函数>一文中,有一节专门讨论"取名字的学问",就是有关变量名称的问题,本温故而知新的原则,这里要复习: 名称格式:(下划线或者字母)+(任意数目的字母,数字或下划线) 注意: 1.区分大小写 2.禁止使用保留字 3.遵守通常习惯 •以单一下划线开头的变量名(_X)不会被from module import *语句导入的. •前后有下划线的变量名(X)是系统定义的变量名,对解释器有特殊意义. •以两个下划线开头,但结尾没有两个下划线的变
-
python共享引用(多个变量引用)示例代码
复制代码 代码如下: a = 3b = a 先上图(图1)吧,大家一看就一目了然了: 变量名和对象,在运行赋值语句b = a之后,变量a,b都指向了对象3的内存空间.假设这时执行 a = 'python', a将指向刚创建的字符串对象.我们再来试试这种情况: 复制代码 代码如下: >>>list_1 = [1,2,3,4]>>>list_2 = list_1>>>list_2>>>list_1[0] = 'python'>>
-
Python增强赋值和共享引用注意事项小结
概述 Python中的增强赋值是从C语言中借鉴出来的,所以这些格式的用法大多和C一致,本身就是对表达式的简写,即二元表达式和赋值语句的结合,比如a += b 和a = a + b 就是一致的,比如还有以下的增强赋值语句. - - - - a += b a &= b a -= b a |= b a *= b a ^= b a /= b a >>=b a %= b a <<= b a **= b a //=b 即增强赋值语句适用于任何支持隐式二元表达式的类型,比如"+
-
解析Python中的变量、引用、拷贝和作用域的问题
在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样.在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没有赋值,那么Python认为这个变量没有定义.如下: >>> a Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'a'
-
python变量赋值方法(可变与不可变)
python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址. 一.可变对象和不可变对象 Python在heap中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变. 不可变(immutable):int.字符串(string).float.(数值型number).元组(tuple) 可变(mutable):字典型(dictionary).列表型(list) 不可变类型特点: 看下面的例子(例1) i = 73 i +=
-
详解Python列表赋值复制深拷贝及5种浅拷贝
概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅拷贝.深拷贝等绕口的名词到底有什么区别和作用呢? 列表赋值 # 定义一个新列表 l1 = [1, 2, 3, 4, 5] # 对l2赋值 l2 = l1 print(l1) l2[0] = 100 print(l1) 示例结果: [1, 2, 3, 4, 5] [100, 2, 3, 4, 5] 可以看到,更改赋值后的L2后L1同样也会被更改,看似简单的"复制"
-
Python直接赋值、浅拷贝与深度拷贝实例分析
本文实例讲述了Python直接赋值.浅拷贝与深度拷贝.分享给大家供大家参考,具体如下: 直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象. 字典浅拷贝实例 实例 >>>a = {1: [1,2,3]} >>> b = a.copy() >>> a, b ({1: [1, 2, 3]}, {1: [1,
-
Python二元赋值实用技巧解析
这篇文章主要介绍了Python二元赋值实用技巧解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python支持类似于a += 3这种二元表达式.比如: a += 3 -> a = a + 3 a -= 3 -> a = a - 3 a *= 3 -> a = a * 3 ... 在python中的某些情况下,这种二元赋值表达式可能比普通的赋值方式效率更高些.原因有二: 二元赋值表达式中,a可能会是一个表达式,它只需计算评估一次,而a
-
Python的赋值、深拷贝与浅拷贝的区别详解
在python中,给一个对象赋值,实际上就是对象对内存空间存储的值的引用.当我们把对象赋值给另一个变量的时候,这个变量并没有拷贝这个对象,而只是拷贝了这个对象的引用而已. 一般情况下我们会通过三种方法来实现拷贝对象的引用. Python直接赋值 直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的变量也会做相同的改变.其实就是对'对象'的引用 示例: >>> list_demo = [2, 4, 6] >>> a = list_demo >>>
-
详解Python直接赋值,深拷贝和浅拷贝
直接赋值: 对象的引用,也就是给对象起别名 浅拷贝: 拷贝父对象,但是不会拷贝对象的内部的子对象. 深拷贝: 拷贝父对象. 以及其内部的子对象 在之前的文章中,提到可变对象和不可变对象,接下来也是以这两者的区别进行展开 直接赋值 对于可变对象和不可变对象,将一个变量直接赋值给另外一个变量,两者 id 值一致,其实本质上是将变量量绑定到对象的过程. >>> a=1 >>> b=a >>> id(a) == id(b) True >>>
随机推荐
- 微信WeixinJSBridge API使用实例
- 风中叶老师讲述的学习方法(学习编程的朋友需要看)
- Mysql免安装版设置密码教程详解
- java中数组的相关知识小结(推荐)
- PHP实现的XML操作类【XML Library】
- MVC分页之MvcPager使用详解
- 在ASP.NET中支持断点续传下载大文件(ZT)源码
- WordPress中邮件的一些修改和自定义技巧
- JS设置手机验证码60s等待实现代码
- 一些常用的JS功能函数代码
- 1Sy.exe 2Sy.exe logo1_.exe禁止病毒的运行小技巧 原创
- 表头固定(利用jquery实现原理介绍)
- 禁止JQuery中的load方法装载IE缓存中文件的方法
- 不用锚点也可以平滑滚动到页面的指定位置实现代码
- php异常处理技术,顶级异常处理器
- 简单谈谈apache与nginx
- Android中使用AsyncTask实现下载文件动态更新进度条功能
- C#使用foreach语句遍历集合类型的方法
- 哈夫曼算法构造代码
- c#代码自动修改解决方案下任意文件实例