【问题标题】:make long integer in python 2 compatible in python 3使python 2中的长整数在python 3中兼容
【发布时间】:2015-07-21 05:23:59
【问题描述】:

我有这样的代码:

max32 = 0xffffffffL
print(sys.getsizeof(max32))
>>32

这是用python 2编写的。

现在我需要确保此代码在 python 3 中也兼容。 但是python3中没有长整数。我该怎么做?

【问题讨论】:

  • 可能想查看此处提供的答案:stackoverflow.com/questions/2104884/… 并查看:python.org/dev/peps/pep-0237
  • @PrakharMohanSrivastava,我编辑了我的问题。我想要的是确保 python 3 中的长数字也具有与 python 2 相同的大小。
  • “我想要确保 python 3 中的长数字也具有与 python 2 中相同的大小” - 你为什么要依赖 that
  • 你根本做不到。在我的 python 2 上,您在 sn-p 上面得到答案 36 - 如果您不能假设在 python 2 的不同实现上大小相同,那么您为什么认为您可以依赖它在蟒蛇3?
  • @skyking,原来我问了一个愚蠢的问题..

标签: python python-3.x


【解决方案1】:

使用 PEP 0237 - long 已重命名为 int ,只需删除 L 并使用它。示例 -

>>> max64 = 0xffffffffffffffff
>>> max64
18446744073709551615

同样来自Whats new in Python 3.0-

PEP 0237:本质上,早就重命名为 int。也就是说,只有一种内置的整数类型,名为 int;但它的行为主要类似于旧的 long 类型。

此外,在 Python 3.x 中,似乎 int 具有可变大小,具体取决于存储在其中的整数 -

>>> max64 = 0xffffffffffffffff
>>> sys.getsizeof(max64)
22
>>> max32 = 0xffffffff
>>> sys.getsizeof(max32)
18
>>> max67 = 0xffffffffffffffffffffffffffffff
>>> sys.getsizeof(max67)
28
>>> max100 = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>>> sys.getsizeof(max100)
68

因此,您不应依赖代码中的字节大小。

【讨论】:

    【解决方案2】:

    python3 中的int 大部分与python2 中的int 兼容。在这方面,与 python2 一起工作的代码将在 python3 中工作,但依赖于的代码除外:

    • sys.getsizeof(x) 返回相同的结果(无论如何它不会)
    • 包含ints 的算术表达式导致相同的类型(如果结果不适合 int,则结果在 python2 中会很长)
    • 依赖于 long 类型存在的代码(您仍然可以定义一个函数 long 在 python3 中做同样的事情)
    • 依赖L后缀的代码

    ...可能还有一些我可能忽略的情况。

    基本原理是,只有一种整数类型,你就有一个整数类型,它的行为就像一个整数应该表现的那样——使用一种这样的类型,或多或少不需要其他不表现为整数的整数类型。应该表现(或需要长类型来补充它们)。例外情况当然是您想要“mod 2^n”行为的情况(如 java 整数类型,其中 2*0x7FFFFFFF 可能变为-2),python2 ints 无论如何都不支持,也许有一个类这种行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      • 2012-07-03
      相关资源
      最近更新 更多