是否可以使 x 的值等于 id(x)?
Is it possible to make value of x equal to id(x)?
我只是想知道是否可以让一个变量的 id 等于它的值。
我试过暴力破解,但没有成功。
我尝试了什么:
x=0
x=id(x)
while x != id(x):
x = id(x)
又一次失败的尝试:
x=0
x=id(x)
while x != id(x):
x = id(x) + x.bit_length()
在给新变量赋值时,编译器是如何为它选择id的?模式是什么?
我觉得理论上是可以的。 id()函数中Pythonreturns变量的内存地址。我认为我们可以做一个特定的地址(例如0x18dd93a5a50),并填充除特定地址外的所有可用内存Python。也就是说,我们让0x18dd93a5a50可用,其他都用上,然后我们把0x18dd93a5a50赋值给x。实际上我们应该分配 32 位来存储整数。但是实现起来比较困难,因为Python不能给指定的内存地址赋值,我们应该用C或者C++来实现(比如代码*(long long*) 0x12345678 = 114514
把114514赋值给内存中的地址0x12345678 (实际上代码不能 运行 因为它 运行 在 RING3 中,但 0x12345678 在 RING0 中,即 OS 内核)。
并回答问题:“给新变量赋值时,编译器是如何为它选择id的?模式是什么?”:编译器(严格来说是CPython)不选择id(内存地址)并且里面有没有模式,OS会选择它的id。
我找到了一个有一些意外结果的解决方案。
此代码立即执行(第一个代码在我的 phone 的解释器上工作,但在我的电脑上不工作):
x=0
while x!=id(x):
x=id(x)-32 # i assume int is 32 bits by default
它在循环的第三个 运行 找到答案。
它不起作用你可以试试这个:
from random import randint
x=0
while x!=id(x):
x=id(x)+randint(-1000,1000)
所以在 运行ning 这段代码之后,x==id(x)
returns True
.
但奇怪的是,x is id(x)
和 id(x) == id(id(x))
returns False
。
这是我尝试的结果:
x == id(x) #True
x == id(id(x)) #False
id(x) == id(id(x)) #False
id(id(x)) == id(id(id(x))) #False
id(id(x)) == id(id(id(id(x)))) #True
我不明白 x == id(x) 但是他们的 id 不一样!
此代码也有效,但我不知道它是否算作有效解决方案:
def id(x):
return x
x=0
x==id(x) #True
我只是想知道是否可以让一个变量的 id 等于它的值。
我试过暴力破解,但没有成功。
我尝试了什么:
x=0
x=id(x)
while x != id(x):
x = id(x)
又一次失败的尝试:
x=0
x=id(x)
while x != id(x):
x = id(x) + x.bit_length()
在给新变量赋值时,编译器是如何为它选择id的?模式是什么?
我觉得理论上是可以的。 id()函数中Pythonreturns变量的内存地址。我认为我们可以做一个特定的地址(例如0x18dd93a5a50),并填充除特定地址外的所有可用内存Python。也就是说,我们让0x18dd93a5a50可用,其他都用上,然后我们把0x18dd93a5a50赋值给x。实际上我们应该分配 32 位来存储整数。但是实现起来比较困难,因为Python不能给指定的内存地址赋值,我们应该用C或者C++来实现(比如代码*(long long*) 0x12345678 = 114514
把114514赋值给内存中的地址0x12345678 (实际上代码不能 运行 因为它 运行 在 RING3 中,但 0x12345678 在 RING0 中,即 OS 内核)。
并回答问题:“给新变量赋值时,编译器是如何为它选择id的?模式是什么?”:编译器(严格来说是CPython)不选择id(内存地址)并且里面有没有模式,OS会选择它的id。
我找到了一个有一些意外结果的解决方案。 此代码立即执行(第一个代码在我的 phone 的解释器上工作,但在我的电脑上不工作):
x=0
while x!=id(x):
x=id(x)-32 # i assume int is 32 bits by default
它在循环的第三个 运行 找到答案。 它不起作用你可以试试这个:
from random import randint
x=0
while x!=id(x):
x=id(x)+randint(-1000,1000)
所以在 运行ning 这段代码之后,x==id(x)
returns True
.
但奇怪的是,x is id(x)
和 id(x) == id(id(x))
returns False
。
这是我尝试的结果:
x == id(x) #True
x == id(id(x)) #False
id(x) == id(id(x)) #False
id(id(x)) == id(id(id(x))) #False
id(id(x)) == id(id(id(id(x)))) #True
我不明白 x == id(x) 但是他们的 id 不一样!
此代码也有效,但我不知道它是否算作有效解决方案:
def id(x):
return x
x=0
x==id(x) #True