RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 571490
Accepted
zergon321
zergon321
Asked:2020-09-29 01:48:19 +0000 UTC2020-09-29 01:48:19 +0000 UTC 2020-09-29 01:48:19 +0000 UTC

在 Python 中分配整数 (int)

  • 772

假设我们有以下代码:

a = 32
b = a

print(a is b)

如何使 b 成为对内存中新值的引用,而不是 a 引用的值,即 如何使操作print(a is b)打印出来False?

python
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    jfs
    2020-09-29T02:50:01Z2020-09-29T02:50:01Z

    b = a使b名称引用与名称相同的对象a。

    该操作检查两个名称是否指向同一个对象,因此在 Python 中a is b它总是a is b在True后面。a = b

    如果您希望名称b引用除 以外的对象a,则只需分配任何其他对象,例如,b = None对于问题中的示例,或者您可以完全删除该名称del b(如果您在此之后尝试使用它,则会出现异常被提高)。


    如果你希望 anda是b相等的(a == b == 32)但不同的对象(a is not b),那么答案可能取决于 Python 的具体实现。

    例如,在 CPython 中,小整数被缓存为……也就是说,在 CPython32 is (16*2) is (31+1)中只有一个对象表示一个数字32。32整数在 Python 中是不可变的,所以无论每次返回相同的对象还是不同,算法都不会改变。

    请注意,运算符不is应用于比较数字。由于不同的对象可以具有相同的值(相等),例如,1000 == (999+1)但是1000 is not (999+1)(在这种情况下,(999+1)返回一个新对象,不同于为1000常量创建的对象)。is可用于与单例进行比较——一个存在于单个实例中的对象,例如None. Python 不承诺表示数字的对象存在于单个实例中,因此使用==整数进行比较。


    a == b == 32 and a is not b将字面问题 ( ) 视为谜语(不用于实际用途)时,有多种解决方案。

    要绕过小数字缓存,您可以从中派生一个int类:

    >>> a = 32
    >>> class Int(int):
    ...     pass
    ...     
    >>> b = Int(a)
    >>> a == b == 32 and a is not b
    True
    

    或者使用floator 任何其他可以与整数进行比较的类型:

    >>> b = 32.
    >>> a == b == 32 and a is not b
    True
    

    最后,如果你想要type(a) == type(b) == intwhereint是内置PyLongObject类型,那么可以做坏事并更改已知常量的值42:

    >>> import ctypes
    >>> import sys
    >>> a = 32
    >>> b = 42
    >>> (ctypes.c_ubyte * sys.getsizeof(b)).from_address(id(b))[-4] = a
    >>> a == b == 32 and a is not b
    True
    >>> type(a) == type(b) == int
    True
    >>> (32 + 10) == 32
    True
    
    • id(b)42在 CPython中返回表示 , 的内存中对象的地址
    • sys.getsizeof(b)b以字节为单位返回对象的大小
    • (ctypes.c_ubyte * sys.getsizeof(b))指定b对象可以容纳的字节数组类型 ( unsigned char[28])
    • .from_address()从内存中创建一个数组,从b对象所在的地址开始
    • arr[-4] = a将末尾的第四个字节分配给32. 更改常量有什么影响42(它与(单个数字/数字更改)在内存中的表示方式有关,特别是它说命令正在使用,这证实了我机器上的字节顺序,这也证实了)。_longobjectpython3PYLONG_BITS_IN_DIGIT == 30sys.int_infosys.byteorder

    该代码的灵感来自文章:“......如何摆脱使用 Python 编写的同事”。

    • 12
  2. Мистер Фикс
    2020-09-29T02:43:07Z2020-09-29T02:43:07Z

    赋值总是在内存中分配一个新位置,除非它是一个集合。

    但在这种情况下,我们谈论的是优化语言的性能,因为这个数字可能不仅仅是你决定使用的:)

    >>> import sys
    >>> sys.getrefcount(32)
    70
    >>> n = 32
    >>> sys.getrefcount(32)
    71
    
    >>> a = 32
    >>> b = 32
    >>> a is b
    True
    

    这是另一个带有集合的示例:

    >>> a = "asdf"
    >>> b = "asdf"
    >>> a is b
    True
    

    但是如果你选择一个更大的数字,那么内存中的区域就已经不一样了,因为这个数字显然没有被程序使用:

    >>> a = 1000000
    >>> b = 1000000
    >>> a is b
    False
    

    因此,如果你检查数字,那么你必须使用比较==。

    • 1
  3. Молодой еще
    2020-05-05T23:38:42Z2020-05-05T23:38:42Z

    你可以这样尝试:

    a=[1]
    b=[1]
    print (a is b)
    
    • -2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5