杂记:Python 两坑
近日写代码又遇到两个 Python 的坑,觉得值得记录。
递归传参问题
Python 里传参的实现是 assignment,但由于 Python 里都是对象,除了几个基本类型,assignment 基本都是引用的赋值,因此在递归里,你传的参数很可能就被下一层修改掉,例如:
def some_func(A):
# do your routines
some_func(A)
如果这个A
是个 mutable 的对象,而你的函数里对A
有修改,那每一层递归都是修改同一个对象A
。
我是在写一个解数独的程序时发现这个问题的。这个程序里有将 Numpy ndarray
作为递归函数的参数,因此它在递归过程中被各种修改,完全乱了套。最后把调用递归传入A
的地方换成A.copy()
就解决了问题。
浮点计算精度问题
这个问题本应是几乎所有编程语言的问题,因为计算机不能精确表示大多数浮点数,例如经典的0.1 + 0.2 != 0.3
。但这个问题在 Python 里其实可以得到解决,就是使用 fraction 模块。我们将所有有理浮点数都表示为分数,就能完全保证计算过程中精度不会丢失。
# 使用 float 会丢失精度
>>> x = 0.1
>>> x == x * 3 / 3
False
# 使用 Fraction 则不会
>>> from fraction import Fraction
>>> x = Fraction('0.1')
>>> x == x * 3 / 3
True
注意,这里是Fraction('0.1')
而不是Fraction(0.1)
,后者还是丢失精度的,因为0.1
这个字面量在 Python 里本身就不是准确的0.1,所以只能用字符串。
(本文完)
杂记:Python 两坑的更多相关文章
- [代码修订版] Python 踩坑之旅进程篇其五打不开的文件
目录 1.1 踩坑案例 1.2 填坑和分析 1.2.1 从程序优化入手 1.2.2 从资源软硬限入手 1.4.1 技术关键字 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: ...
- python的坑--你知道吗?
python的坑--你知道吗? 1.列表的坑 坑的地方是:因为列表用pop之后,后面的索引都会自动减一 # 列表的坑之一 list1 = ['python','java','php','c','c++ ...
- Python两个变量的值进行交换的方法
Python两个变量的值进行交换的方法 使用第三方变量: '''这是第一种赋值方法,采用第三方变量''' c = a a = b b = c 使用两个变量: '''使用两个变量''' a = a+b ...
- python 两个队列进行对比
python 两个队列进行对比 list01 = [1,2,3,4] list02 = [1,3,5] for i01 in list01: is_in_02 = False for i02 in l ...
- Python踩坑之旅其一杀不死的Shell子进程
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 坑后扩展 1.4.1 扩展知识 1.4.1 技术关键字 1.5 填坑总结 1.1 踩坑案例 踩坑的程序是个常驻的Agent类管理进程 ...
- Python 踩坑之旅进程篇其四一次性踩透 uid euid suid gid egid sgid的坑坑洼洼
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 技术关键字 1.5 坑后思考 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 代码示例: 菜 ...
- Python 踩坑之旅文件系统篇其一文件夹也是个文件
目录 1.1 案例 1.2 分析 1.3 扩展 1.4 技术关键字 下期预告 代码示例支持 平台: Mac OS Python: 2.7.10 代码示例: - wx: 菜单 - Python踩坑指南代 ...
- python踩坑系列之导入包时下划红线及报错“No module named”问题
python踩坑系列之导入包时下划红线及报错“No module named”问题 使用pycharm编写Python时,自己写了一个包(commontool),在同级另一个路径下(fileshand ...
- Python踩坑:类与类对象类型参数传递与使用
前言 对初学者来说,Python确实简单好用,毕竟动态类型语言,不用定义就可以拿来用,类型之间随意转换简直不要太方便,因此Python用来写写小脚本,爬虫程序什么的,没什么问题. 不过,一旦用来开发稍 ...
随机推荐
- c/c++程序连接mysql
1.libmysql.dll添加到System32文件夹 “regsvr32 libmysql.dll”注册 2.项目-->属性-->c/c++-->常规-->附加包含目录-- ...
- Java基础 -- 持有对象(容器)
一 容器的用途 如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构. 我们可以通过创建引用来持有对象,如 Class clazz; 也可以通过数组来持有多个对象,如 Class[] ...
- php5.4、5.5、5.6高版本中htmlspecialchars兼容性处理
在使用php5.4以上版本以上时会有一个函数可能会报错 如下 Warning: htmlspecialchars(): charset `gbk' not supported, assuming ut ...
- 20175209 实验二《Java面向对象程序设计》实验报告
20175209 实验二<Java面向对象程序设计>实验报告 一.实验前期准备 了解三种代码 伪代码 产品代码 测试代码 我们先写伪代码,伪代码 从意图层面来解决问题: 有了伪代码 我们用 ...
- Jenkins实践之入门体验
官网:https://jenkins.io/ 持续集成,快速发布是DevOps实践的最好方式. 目录 准备工作 下载/安装/启动 基础配置 插件配置 构建第一个Java项目 部署项目 准备工作 在使用 ...
- spark2.2.1安装、pycharm连接spark配置
一.单机版本Spark安装 Win10下安装Spark2.2.1 1. 工具准备 JDK 8u161 with NetBeans 8.2: http://www.oracle.com/technetw ...
- 剑指Offer编程题3——从尾到头打印链表
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 题目解析 方法1:建立两个vector,第一个用来存储正向访问的数据,第二个用来反向存储. /** * struct L ...
- Linux环境 tp5.1 Could not open input file: think
服务器命令行执行:php /项目目录/think queue:listen 报如下错误 初步分析是 queue:listen 在代码中要重启一个work进程,用到了think ,导致找不到该文件的路 ...
- 20175204 张湲祯 2018-2019-2《Java程序设计》第七周学习总结
20175204 张湲祯 2018-2019-2<Java程序设计>第七周学习总结 教材学习内容总结 -第八章常用实用类要点: 一.String类: 1.String类所在的包:java. ...
- SpringSecurity的配置分析
在分析SpringSecurity前,基于多年前使用SpringSecurity和近年来使用Shiro的经验, SpringSecurity这些年在发展和SpringBoot整合之后,也逃不出以下的一 ...