杂记: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用来写写小脚本,爬虫程序什么的,没什么问题. 不过,一旦用来开发稍 ...
随机推荐
- Codeforces Round #554 (Div. 2)自闭记
A 签到 #include<bits/stdc++.h> using namespace std; ],t[],ans; int main() { scanf("%d%d&quo ...
- 第四十一篇-android studio 关闭自动保存功能
此方法不可用. 第一步:取消自动保存功能 File > Settings > Appearance & Behavior > System Settings > Syn ...
- STL初始化initializer_list
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h&g ...
- 使用基本MVC2模式创建新闻网站
MVC简介 所谓MVC,即Model-View-Controller. (1)Model层:Model指模型部分,一般在应用中Model层包括业务处理层和数据访问层.数据访问层主要是对数据库的一些操作 ...
- golang-Beego-orm创建的坑
Orm使用sqlites不识别问题 Idc string `description:"机房"` 这个description sqlites的数据库不识别.解决方法 去掉descri ...
- jmeter 多个sql写在一个jdbc请求中注意事项
在url里面加上?allowMultiQueries=true 类型选callableStatement
- 适用于单片机的数据加密算法:xxtea
转:https://www.cnblogs.com/LittleTiger/p/4384741.html 各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加 ...
- 一个关于kindle固件修改的问题
手头有一个序列号为B05A开头的日版kpw2,默认没有中文界面.之前看过@5201992318q 大神的帖子,原因是系统langpicker.conf文件中有一段判断序列号并删除语言的代码,于是我萌发 ...
- 关于HashSet集合add元素
HashSet集合add元素底层实现使用的是HashMap. 简单记忆:无论HashMap put元素还是HashSet add元素,都先调用hashCode()方法,若hashCode方法返回值不同 ...
- centos环境下安装redis
1.安装gcc和gcc-c++ 使用which gcc 和which g++检查是否已经安装,若已有安装,跳过下面安装步骤 安装gcc yum -y install gcc 安装gcc-c++ yum ...