博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
杂记:Python 两坑
阅读量:6190 次
发布时间:2019-06-21

本文共 784 字,大约阅读时间需要 2 分钟。

近日写代码又遇到两个 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 / 3False# 使用 Fraction 则不会>>> from fraction import Fraction>>> x = Fraction('0.1')>>> x == x * 3 / 3True

注意,这里是Fraction('0.1')而不是Fraction(0.1),后者还是丢失精度的,因为0.1这个字面量在 Python 里本身就不是准确的0.1,所以只能用字符串。

(本文完)

转载于:https://www.cnblogs.com/gscnblog/p/10587427.html

你可能感兴趣的文章
DotNetTextBox控件添加外挂插件功能的图文教程。
查看>>
Python--day46--mysql触发器
查看>>
[转] 浅谈 C++ 中的 new/delete 和 new[]/delete[]
查看>>
java使用elasticsearch进行模糊查询-已在项目中实际应用
查看>>
【Dart学习】-- Dart之匿名方法&闭包
查看>>
构成vspher虚拟化平台所需构建概念
查看>>
java设计模式之组合模式
查看>>
lr_save_var() 截取任意字符串长度,以参数形式输出(参数转变量)
查看>>
【1131】C/C++经典程序训练1---最大公约数与最小公倍数
查看>>
Apache Struts2高危漏洞(S2-057CVE-2018-11776)
查看>>
快速排序(算法导论中的版本)
查看>>
网页设计制作CSS实现隔行换色两种方法
查看>>
分布式爬虫(一)------------------分布式爬虫概述
查看>>
小作坊的大道理——读《走出软件作坊》有感
查看>>
php 接口类,抽象类 的实际作用
查看>>
webstorm 配合IIS使用
查看>>
hash,面向对象
查看>>
P3649 [APIO2014]回文串
查看>>
C++对二进制文件的操作实例
查看>>
Java开发必会的Linux命令 转载(http://www.importnew.com/17354.html)
查看>>