相关疑难解决方法(0)

'is'运算符与非缓存整数意外地运行

在玩Python解释器时,我偶然发现了关于is运算符的这个冲突的情况:

如果评估发生在它返回的函数中True,如果它在外部完成则返回False.

>>> def func():
...     a = 1000
...     b = 1000
...     return a is b
...
>>> a = 1000
>>> b = 1000
>>> a is b, func()
(False, True)
Run Code Online (Sandbox Code Playgroud)

由于is运营商评估id()的参与对象,这意味着ab指向同一个int函数内声明的时候实例func,但是,相反,它们指向一个不同的对象时,它的外面.

为什么会这样?


注意:我知道identity(is)和equal(==)操作之间的区别,如了解Python的"is"操作符中所述.另外,我也知道python正在对范围内的整数执行缓存,[-5, 256]"is"中所述,运算符与整数一起出现意外行为.

不是这里的情况,因为数字超出了该范围,我确实想要评估身份而不是平等.

python int identity python-3.x python-internals

41
推荐指数
2
解决办法
1420
查看次数

Python3多重赋值和内存地址

看完这个这个,这是非常相似,我的问题,我仍然无法理解以下行为:

a = 257
b = 257
print(a is b) #False
a, b = 257, 257
print(a is b) #True
Run Code Online (Sandbox Code Playgroud)

打印时id(a),id(b)我可以看到在单独的行中分配值的变量具有不同的ID,而对于多个赋值,两个值具有相同的id:

a = 257
b = 257
print(id(a)) #139828809414512
print(id(b)) #139828809414224
a, b = 257, 257
print(id(a)) #139828809414416
print(id(b)) #139828809414416
Run Code Online (Sandbox Code Playgroud)

但是,通过说多个相同值的赋值总是创建指向同一个id的指针,从而解释这种行为是不可能的:

a, b = -1000, -1000  
print(id(a)) #139828809414448
print(id(b)) #139828809414288
Run Code Online (Sandbox Code Playgroud)

是否有一个明确的规则,它解释了变量何时变得相同id而不是?

编辑

相关信息:此问题中的代码以交互模式运行(ipython3)

python python-3.x multiple-assignment

10
推荐指数
1
解决办法
301
查看次数