【问题标题】:Python mistaking float for stringPython将浮点数误认为字符串
【发布时间】:2010-03-21 01:45:57
【问题描述】:

我收到

TypeError: Can't convert 'float' object to str implicitly

使用中

Gambler.pot += round(self.bet + self.money * 0.1)

底池、下注和金钱都是双倍的(或者至少应该是双倍的)。我不确定这是否是另一个 Eclipse 的东西,但我如何让行编译?

初始化betmoney 的代码:

class Gambler:
    money = 0
    bet = 0

测试用例:

number = 0
print("Here, the number is a {0}".format(type(number)))
number = input("Enter in something: ")
print("But now, it has turned into a {0}".format(type(number)))

测试用例的输出:

Here, the number is a <class 'int'>
Enter in something: 1
But now, it has turned into a <class 'str'>

显然,input() 正在将其更改为字符串。

编辑:终于解决了问题(我认为)

self.bet = int(self.bet.strip())

用户输入值后。虽然我不知道这是否是解决问题的最佳方法:)

Daniel G. 的一个更好的解决方案:

self.bet = float(input("How much would you like to bet? $"))

【问题讨论】:

  • 请显示初始化self.bet和self.money的代码。
  • 你还没有证明那些不是字符串。
  • 这就够了,还是我应该发布更多代码?
  • 这些是局部变量。你需要展示它们是如何被绑定为对象的属性的。
  • 您是否已经尝试打印 type(self.bet)type(self.money)type(self.pot)(就在引发异常的行之前)以查看它们是否确实是数字?

标签: python string floating-point python-3.x


【解决方案1】:

input() 在 3.x 中只返回字符串。将其传递给数字构造函数以将其转换为数字是程序员的工作。

【讨论】:

  • 我相信 3.x 中的 input() 与 2.x 中的 raw_input() 相同
  • @MatrixFogg:我在尝试时得到NameError: global name 'raw_input' is not defined。我做错了吗?
  • @wrongusername: 3.x 没有raw_input(),只有input()
【解决方案2】:

你在初始化pot吗?您是否尝试过存储中间结果来追踪问题的来源?最后,你知道pdb 吗?这可能会有很大帮助。

class Gambler:
    pot = 0.0
    def __init__(self, money=0.0)
        self.pot = 0.0
        self.bet = 0.0
        self.money = money

    def update_pot(self):
        import pdb; pdb.set_trace()
        to_pot = self.bet + self.money * 0.1
        to_pot = round(to_pot)
        Gambler.pot = Gambler.pot + to_pot

执行 set_trace() 行时,您将收到提示。到达那里后尝试查看当前值。

(Pdb) h    # help
(Pdb) n    # go to next statement
(Pdb) l    # list source code
...
(Pdb) to_pot
...
(Pdb) self.bet
...
(Pdb) self.money
...
(Pdb) Gambler.pot
...
(Pdb) c    # continue

【讨论】:

    【解决方案3】:

    Python3.2 (py3k:77602) 给出以下错误消息:

    >>> "1.2" * 0.1 #1 回溯(最近一次通话最后): 文件“”,第 1 行,在 TypeError:不能将序列乘以“float”类型的非整数 >>> "3.4" + 1.2 * 0.1 #2 回溯(最近一次通话最后): 文件“”,第 1 行,在 TypeError:无法将“浮动”对象隐式转换为 str >>> n = "42" >>> n += round(3.4 + 1.2 * 0.1) #3 回溯(最近一次通话最后): 文件“”,第 1 行,在 TypeError:无法将“int”对象隐式转换为str

    我怀疑您的错误消息是因为您的实际值之一是字符串,而不是类似于 #2 的场景中的预期浮点数,这与您的异常完全匹配。

    如果你能写一个testcase,那将是一个很大的帮助。


    请记住,Py3.x 的 input 与 Py2.x 的 raw_input 和 Py2.x 的 input 相同> 消失了(它相当于使用 evai,你不想这样做)。因此,3.x 中的 input 将始终返回一个字符串。使用 int 进行转换:

    n = int(input("Enter a number: "))
    

    如果你想处理输入错误,那么捕获 ValueError,这是 int 在错误时引发的:

    try:
      n = int(input("Enter a number: "))
    except ValueError:
      print("invalid input")
    else:
      print("squared:", n*n)
    

    【讨论】:

    • 我使用的是 3.1.1。如果可以的话,我会尽快写测试用例:)
    • 我做到了...问题似乎是输入一些东西把它变成了一个字符串
    【解决方案4】:

    如果Gambler.potself.betself.money 中的任何一个以某种方式变成了字符串(因为它们在某些时候被设置为字符串),+ 将被视为字符串连接,这会导致您出现错误消息看。

    【讨论】:

    • 似乎self.bet在输入后有:(
    【解决方案5】:

    在 Python 3.x 中,input() 替换了 Python 2.x 的 raw_input()。因此,函数 input() 返回用户输入的确切字符串(就像 raw_input() 在以前的版本中所做的那样)。

    要获得 Python 2.x 的行为,您可以这样做

    number = eval(input("Please enter a number: "))
    

    但是,我不建议使用“eval”,因为用户可以在其中放置他们想要的任何 Python 行,这可能不是您想要的。如果你知道你想要 float,只需告诉 Python 这就是你想要的:

    number = float(input("Please enter a number: "))
    

    【讨论】:

      【解决方案6】:

      正如评论中所说,您所展示的是将局部变量初始化为 0。请尝试以下操作:

      class Gambler:
          def __init__(self):
              self.bet = 0.0
              self.money = 0.0
      
          def calc_pot(self):
              self.pot = round(self.bet  + self.money * 0.1)
      
      g = Gambler()
      g.bet = 2.0
      g.money = 5.0
      g.calc_pot()
      
      print "Pot = %f" % (g.pot)
      

      另外,请确保没有任何东西可能会将这些成员变成字符串。

      【讨论】:

        猜你喜欢
        • 2019-07-10
        • 1970-01-01
        • 2011-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-25
        • 1970-01-01
        相关资源
        最近更新 更多