在玩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()
的参与对象,这意味着a
并b
指向同一个int
函数内声明的时候实例func
,但是,相反,它们指向一个不同的对象时,它的外面.
为什么会这样?
注意:我知道identity(is
)和equal(==
)操作之间的区别,如了解Python的"is"操作符中所述.另外,我也知道python正在对范围内的整数执行缓存,[-5, 256]
如"is"中所述,运算符与整数一起出现意外行为.
这不是这里的情况,因为数字超出了该范围,我确实想要评估身份而不是平等.
我用分号"发现了奇怪的行为"; 在Python中.
>>> x=20000;y=20000
>>> x is y
True
>>> x=20000
>>> y=20000
>>> x is y
False
>>> x=20000;
>>> y=20000
>>> x is y
False
Run Code Online (Sandbox Code Playgroud)
为什么第一次测试返回"True",其他测试返回"False"?我的Python版本是3.6.5.
我无法理解以下行为.我正在创建2个字符串,并使用is运算符来比较它.在第一种情况下,它的工作方式不同.在第二种情况下,它按预期工作.我使用逗号或空格的原因是什么,它False
与比较is
时显示,当没有使用逗号,空格或其他字符时,它给出True
Python 3.6.5 (default, Mar 30 2018, 06:41:53)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 'string'
>>> b = a
>>> b is a
True
>>> b = 'string'
>>> b is a
True
>>> a = '1,2,3,4'
>>> b = a
>>> b is a
True
>>> b = '1,2,3,4'
>>> b is a
False
Run Code Online (Sandbox Code Playgroud)
有关python以不同方式解释字符串的原因的可靠信息吗?我最初理解,a
并b
指同一个对象.然后说 …
这是一个关于Python缓存机制的系列问题。
首先,我读了为什么 (0-6) 是 -6 = False?发现Python中有一个叫做整数对象池的东西,然后我尝试了一些其他情况,发现了一个超出我理解的现象
In : a = 257; b = 257; id(a) == id(b)
Out: False
In : a, b = 257, 257; id(a) == id(b)
Out: True
In : a, b = (1,), (1,); id(a) == id(b)
Out: False
Run Code Online (Sandbox Code Playgroud)
正如该问题的答案提到的,257不在小整数范围内,因此当您分配一个值为257的新变量时,应该有一个新对象,但a,b = 257, 257
显示True
。所以我假设这种分配方法会在初始化期间为它们分配两个相同的ID,但第三种情况证明这种假设是错误的。
您能否解释一下为什么这种分配方式对于非缓存整数(不在 [-5,256] 中)和元组有不同的行为?
当我在代码中出现错误时,我正在使用python中的队列,即使代码看起来非常完美,但后者当我改变了赋值样式时,代码开始工作.代码之前看起来像这样.
x=y=Queue()
x.put("a")
x.put("b")
print y.get()
Run Code Online (Sandbox Code Playgroud)
后来我改为这个,它开始工作了
x=Queue()
y=Queue()
x.put("a")
x.put("b")
print y.get(10)
Run Code Online (Sandbox Code Playgroud)
为什么两个代码的工作方式不同
为什么多个赋值对int有明确的引用,而不是列表或其他对象?
>>> a = b = 1
>>> a += 1
>>> a is b
>>> False
>>> a = b = [1]
>>> a.append(1)
>>> a is b
>>> True
Run Code Online (Sandbox Code Playgroud)