【发布时间】:2018-08-04 14:30:53
【问题描述】:
这对我来说是一个很大的谜。
我有一个完全由粘贴代码组成的 python 脚本:
def onedutilfun(x):
u = -( (x/2)**(1/2) + 2*((1-x)/3)**(1/2))
return u
test = onedutilfun(0.01)
test2 = onedutilfun(99)
print(test)
print(test2)
我正在 Spyder 中运行此代码。我安装了一个运行 python 3.6 的 Spyder 和另一个运行 2.7 的 Spyder。如果我在 2.7 中运行它,无论我传递什么值,它都会返回 -3。我尝试了各种到浮点数的转换(u 和 x 已经是浮点数,Spyder 同意我的观点),但无济于事。
如果我在 python 3.6 中运行相同的代码,它可以正常工作,准确地返回它应该返回的内容。可能会发生什么?我意识到一种解决方案是使用更新的 python,但我需要提供在 2.7 中运行的代码。
值 99 返回一个复数,fyi。
我已将代码粘贴到 Google 的搜索栏中,图形函数(在实数系统中的函数域上)看起来也不错。
我之前在我的 Python 2.7 副本中成功使用了 **,并在它可以返回复数的情况下使用它,或者如果它返回复数可能会引发错误,除非我告诉它返回一个复数。
除了想要工作代码之外,我真的很喜欢解释我的代码发生了什么。谢谢。
【问题讨论】:
-
x可能是一个浮点数,但在 Python 2.7 -1/2== 0... 所以与** 0相关的任何内容都是 1 - ergo,你在 2.7 中的函数实际上是:return -(1 + 2*1)这是你得到的-3。 -
可能一个简单的解决方法是使用
** 0.5而不是1/2...(或者,使用更明确的math.sqrt)(或者甚至在顶部放置一个from __future__ import division模块) -
谢谢。这个答案是有道理的;没有意识到 python 2.7 中的整数除法就是这种情况。
标签: python-3.x python-2.7 spyder