python编程中的小问题汇总
前言
本文记录了我在python编程中遇到的各种小问题,持续更新。
1. x = x + 1 VS x += 1
辨析下面这两段代码:
>>> x = y = [1, 2, 3, 4]
>>> x += [4]
>>> x
[1, 2, 3, 4, 4]
>>> y
[1, 2, 3, 4, 4]
>>> x = y = [1, 2, 3, 4]
>>> x = x + [4]
>>> x
[1, 2, 3, 4, 4]
>>> y
[1, 2, 3, 4]
1)’+=’ 调用 in-place 的加法,即 iadd 方法。 此方法采用两个参数,但是原地进行更改,修改了第一个参数的内容(即x被修改)。 由于x和y都指向相同的Pyobject,因此它们都是相同的。
2)x = x + [4] 调用 add 方法,相当于 x.add([4]),并没有原地进行更改或添加值,它会创建一个新列表[1, 2, 3, 4, 4],该列表指向了x,而y仍指向旧列表[1, 2, 3, 4],因此它们不相同。
2. np.matmul(@) VS np.dot VS np.multiply(*)
np.matmul(a, b)是矩阵乘法,运算符重载为@;np.dot(a, b)是点积;np.multiply(a, b)是逐元素乘法,运算符重载为*
关于三者的辨析,直接上结论:
1)如果a或者b有一个是标量,用np.multiply()或者*,np.dot()可以但不推荐,np.matmul()不可以;
2)如果a、b是向量,则使用np.dot()向量内积;
3)如果a、b是二维array(矩阵),则使用np.matmul()矩阵乘法;
4)a、b是二维及以下array的情况下,np.matmul()与np.dot()效果相同;
5)a、b是大于二维array的情况下,如下例:
a = np.array([i for i in range(120)]).reshape([2,3,4,5])
b = np.array([i for i in range(120)]).reshape([2,3,5,4])
>>> np.matmul(a,b).shape
(2, 3, 4, 4)>>> np.dot(a,b).shape
(2, 3, 4, 2, 3, 4)>>> np.matmul(b,a).shape
(2, 3, 5, 5)>>> np.dot(a,b).shape
(2, 3, 5, 2, 3, 5)
重点是观察结果的维度不同,np.matmul(a,b)的维度为(2, 3, 4, 4),np.dot(a,b)的维度为(2, 3, 4, 2, 3, 4),这是因为np.matmul()遵循了矩阵乘法的维度规则(n,k),(k,m)->(n,m),a的最后一个维度5和b的倒数第二个维度5消掉。
具体的运算,用一个简单点的例子说明:
a = np.array([i for i in range(12)]).reshape([2,2,3])
b = np.array([i for i in range(12)]).reshape([2,3,2])
"""
a
[[[ 0 1 2][ 3 4 5]][[ 6 7 8][ 9 10 11]]]
b
[[[ 0 1][ 2 3][ 4 5]][[ 6 7][ 8 9][10 11]]]
""">>> np.matmul(a,b)
array([[[ 10, 13],[ 28, 40]],[[172, 193],[244, 274]]])>>> np.dot(a,b)
array([[[[ 10, 13],[ 28, 31]],[[ 28, 40],[100, 112]]],[[[ 46, 67],[172, 193]],[[ 64, 94],[244, 274]]]])
3. “==” VS “is”
在python中,双等号 ==
和 is
好像都是用于判断两个东西是否相等,但实际上两者是不一样的。
==
是用于判断值(value)相等,即判断两个对象是否具有相同的值。
is
是用于判断参考(reference)相等,即判断两个引用是否引用同一个对象。
实际上,以下两条语句是等价的:
a is b
id(a) == id(b)
id() 函数可以理解为一种哈希函数,用来唯一标识python中的不可变类型。
python编程中的小问题汇总相关推荐
- Python 编程中常用的12种基础知识总结
Python 编程中常用的12 种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出 ...
- python random模块中的指令_10分钟让你掌握python编程中random模块功能使用,非常详细...
原标题:10分钟让你掌握python编程中random模块功能使用,非常详细 python作为一门高级编程语言,它的定位是优雅.明确和简单.阅读Python编写的代码感觉像在阅读英语一样,这让使用者可 ...
- python编程中常用的12种基础知识总结
python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出,进 ...
- python编程中的运算_Python编程中的四大运算法则
接触过编程的人都知道,编程中的数学知识无处不在,通过数学建模能够解决我们实际生活中的很多问题.当然这并不是说必须要成为一名数学大神才能学编程,但掌握数学知识在编程中的表达方法却是很有必要的,今天南京小 ...
- if __name__ == __main__:什么意思_秒懂Python编程中的if __name__ == 'main' 的作用和原理...
来源:菜鸟分析 链接: https://zhuanlan.zhihu.com/p/34112508 一天偶然发现知乎上有篇关于对python编程中的if __name__ == 'main'的理解陈述 ...
- python编程基础知识点总结_【转载】Python编程中常用的12种基础知识总结
Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出,进 ...
- python程序调用写好的代码_扣丁学堂浅谈Python编程中NotImplementedError的使用方法...
扣丁学堂浅谈Python编程中NotImplementedError的使用方法 2018-07-04 14:08:02 2559浏览 本篇文章扣丁学堂 Python编程中raise可以实现报出错误的功 ...
- python的知识点运用_程序猿在Python编程中不得不使用的十二种基础知识
Python编程中常用的12种基础知识,其中肯定有你不会的! 人生苦短,我用Python 1.正则表达式替换 目标: 将字符串line中的 overview.gif 替换成其他字符串. 人生苦短,我用 ...
- Python编程中一定要注意的那些“坑”(二)
之前发过一些坑,请参考Python编程中一定要注意的那些"坑"(一)和Python函数默认值参数的2个坑 今天说说列表的内存自动伸缩带来的坑. 假设有个列表如下,现在下删除其中的所 ...
最新文章
- 详解分布式系统与消息投递
- 【百度地图API】如何区分地址解析和智能搜索?
- 剑指offer python版 找出数组中重复的数字
- [MyBatisPlus]MyBatisX插件
- python进阶项目设计_Python进阶循环设计
- java 两个线程同步_Java 多线程(二)—— 线程的同步
- 单节点Rancher 2.5.1 证书过期报错 x509: certificate has expired or is not yet valid 解决方案
- mysql 安装服务 w_MySQL的安装与配置
- B站、字节跳动等上榜2021福布斯中国最佳雇主榜;中兴发布“5G 智能T恤”:可监测呼吸;Linux 5.13 发布|极客头条...
- [...]ubuntu rvm rails 安装完之后消失的解决方法
- Sync Framework 词汇表
- delphi启动ie调用本地html传参数_年轻人不讲武德啊!了解下浏览器如何解析html、css,js
- Origin修改安装位数
- python实现isprime函数_Python实现isPrime函数
- 嵌入式软件测试环境搭建,基于DOORS的嵌入式软件测试环境需求管理
- python实现百度语音合成(超详细!!)
- CCF题目:相邻数对
- 32位系统无法运行64位系统安装文件
- Mac Pro硬盘清理,为啥我的系统占用如此之多的磁盘空间
- Coursera半价优惠