为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中强制复制一个小的 int

在 Python 中强制复制一个小的 int

子衿沉夜 2022-08-16 18:59:44
作为一个玩具问题,我试图想出这样的物体:a, btype(a) == type(b) == int # Truea + 1 == b + 1 == 1       # Truea is b                    # False似乎又回到了 ,如这里所讨论的。deepcopy_deepcopy_atomic是否可以在Python中创建小int的副本?
查看完整描述

4 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

是的,这是可能的,并且没有低级的黑客或作弊:


>>> a = 0

>>> b = 9**99 % 9**99

>>> type(a) == type(b) == int

True

>>> a + 1 == b + 1 == 1

True

>>> a is b

False

我正在使用Python 3.8.1在本地执行此操作,但是您也可以在 repl.it 和 www.python.org/shell/ 上重现它。


对于小阳性:


>>> a = 7

>>> b = (9**99 + a) % 9**99

>>> b, type(b), a == b, a is b

(7, <class 'int'>, True, False)

对于小底片:


>>> a = -2

>>> b = (9**99 + a) % -9**99

>>> b, type(b), a == b, a is b

(-2, <class 'int'>, True, False)


查看完整回答
反对 回复 2022-08-16
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

这可能不是问题的意图,但如果允许重写,则可以满足问题中的3个断言,以便以下代码将通过:int


int = type('', (int,), dict(vars(int)))

a = int(0)

b = int(0)

assert type(a) == type(b) == int

assert a + 1 == b + 1 == 1

assert a is not b


查看完整回答
反对 回复 2022-08-16
?
largeQ

TA贡献2039条经验 获得超7个赞

您的问题的答案取决于您认为是一个小int。根据文档

当前实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建 int 时,您实际上只获取对现有对象的引用。

对于整数,行等效于 。对于范围,所有数字的 ID 都是预定义的,这意味着并充当现有对象的别名。a is bid(a) == id(b)[-5, 256]ab

满足条件的唯一方法是 当 .由于 在上述范围内,因此无法返回 。a, ba + 1 == b + 1 == 1a = b = 00a is bFalse


查看完整回答
反对 回复 2022-08-16
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

我能够让以下内容为CPython工作:


import ctypes


x = 2

y = 3


ctypes.c_int.from_address(id(y) + 24).value = x


print(x == y) # True

print(x is y) # False

我无法逃脱或不崩溃口译员。x = 0x = 1


查看完整回答
反对 回复 2022-08-16
  • 4 回答
  • 0 关注
  • 195 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信