【问题标题】:TypeError: bad operand type for unary ~: 'long' in PythonTypeError:一元操作数类型错误〜:Python中的'long'
【发布时间】:2015-01-06 02:18:18
【问题描述】:

我来自 C 背景,因此 Python 中的这个问题真的让我感到困惑

考虑一下

print ~(1 << 1)

这会正确打印-3

考虑一下

print ~(1 << 0)

这会标记类似的错误

TypeError: bad operand type for unary ~: 'long'

我检查了班次计数的其他各种正值,它工作正常。只有零班次计数似乎不起作用。我在 SO 上找到的关于一元运算符的所有类似帖子都涉及其他运算符,例如 +- 等,但不是 ~

我只是时不时地涉足 Python,所以我可能会遗漏一些愚蠢的东西,但谷歌搜索很有帮助

PS:我在codeskulptor 上运行它,它可能使用 Python 2.7,但我不确定

编辑:这原来是 Codedeskulptor 中的一个错误。我写了一封邮件给 Rixner 教授,他是主要的开发者,他注意到了这个错误。谢谢大家。

【问题讨论】:

  • 为我工作 (2.7.6)。你用的是什么版本的python?
  • 另外,在 Python 3.0 及更高版本中 print ~(1 print (~(1 << 1)) 打印 -3。在 Python 3.3 上为我工作。我也在 IDEONE here 上运行过它
  • @EthanFurman 它也没有被标记为 [python2],因此除非问题中明确提及,否则不应假定任何版本。 [python] 是关于两个版本的。
  • 这在 CPython、Jython、IronPython 和 PyPy(2.X 分支)中对我有用,所以你一定是在一个非常奇怪的环境中。
  • 在 2.4、2.5、2.6 和 2.7 上为我工作。

标签: python bit-manipulation typeerror unary-operator


【解决方案1】:

这是 CodeSkulptor 实现的错误。

如果将值强制返回 int,它会起作用:

print ~(int(1 << 0))

好吧,也许“错误”太严重了——看看他们的网站,他们只声称“实现了 Python 2 的一个子集”。

【讨论】:

  • print() 的实现?你的意思是它被覆盖了?
  • @hagubear:不,不是打印,但是 CodeSkulptor 的 Python 实现确实可以在 long 类型上正常工作,至少在 ~ 运算符上是这样。
  • 谢谢!您关于将其强制为 int 的建议适用于 codeskulptor。我将接受您的修改并将错误留给 codeskulptor 的开发人员 :)
【解决方案2】:

这适用于 Python2 和 Python3;演示:

$ python --version
Python 2.7.6
$ python -c 'print(~(1<<0))'
-2

$ python3 --version
Python 3.4.2
$ python3 -c 'print(~(1<<0))'
-2

您能否多展示一下您的脚本并解释您使用的 Python 版本(以及实现!)?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2013-03-28
    • 2019-02-17
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多