为什么以下在Python中出现意外行为?
>>> a = 256
>>> b = 256
>>> a is b
True # This is an expected result
>>> a = 257
>>> b = 257
>>> a is b
False # What happened here? Why is this False?
>>> 257 is 257
True # Yet the literal numbers compare properly
Run Code Online (Sandbox Code Playgroud)
我使用的是Python 2.5.2.尝试一些不同版本的Python,似乎Python 2.3.3显示了99到100之间的上述行为.
基于以上所述,我可以假设Python在内部实现,使得"小"整数以不同于大整数的方式存储,is运算符可以区分.为什么泄漏抽象?当我不知道它们是否是数字时,比较两个任意对象以查看它们是否相同的更好的方法是什么?
我今天开始学习Python,我想出了创建一个程序,打印从0到10 000的所有素数的想法.我设法让我的程序打印出所有质数,直到251,此时它停止打印出数字.为什么这样做?
这是代码:
for numberToCheck in range(2,10000):
divider = 2
while numberToCheck > divider:
if numberToCheck % divider is 0:
break
else:
divider += 1
if numberToCheck is divider:
print(numberToCheck, "is a prime number.")
Run Code Online (Sandbox Code Playgroud) 我开始学习Python(python 3.3),我正在尝试is运算符.我试过这个:
>>> b = 'is it the space?'
>>> a = 'is it the space?'
>>> a is b
False
>>> c = 'isitthespace'
>>> d = 'isitthespace'
>>> c is d
True
>>> e = 'isitthespace?'
>>> f = 'isitthespace?'
>>> e is f
False
Run Code Online (Sandbox Code Playgroud)
似乎空间和问号使is行为表现不同.这是怎么回事?
编辑:我知道我应该使用==,我只是想知道为什么is会这样.
我(可能是错误的)认为is运算符正在进行id()比较.
>>> x = 10
>>> y = 10
>>> id(x)
1815480092
>>> id(y)
1815480092
>>> x is y
True
Run Code Online (Sandbox Code Playgroud)
然而,val is not None看起来它并不那么简单.
>>> id(not None)
2001680
>>> id(None)
2053536
>>> val = 10
>>> id(val)
1815480092
>>> val is not None
True
Run Code Online (Sandbox Code Playgroud)
然后,'是'运营商做了什么?它只是我推测的对象id比较吗?如果是这样,val is not None在Python中被解释为not (val is None)?
python中"is"表达式的不稳定行为.
>>> 258 -1 is 257
False
Run Code Online (Sandbox Code Playgroud)
和
>>> 258 -1 == 257
True
Run Code Online (Sandbox Code Playgroud)
python如何评估"是"表达式?为什么它显示为假,尽管它是真的?
为什么它只发生在某些数字上?
2 - 1是1真
工作得非常好.
这是一个关于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缓存小整数的问题.
Python编译器是否有可能在编译时用-6替换(0 - 6)?下面的代码表明它没有.如果不可能,为什么不呢?我不认为的含义0,-或者6可以在运行时不同.
如果这是可能的,为什么CPython不这样做?
# test_integers.py
def test_integers():
print "-6 is -6 ?", -6 is -6 # True
print "(0 - 6) is -6 ?", (0 - 6) is -6 # False
# import_test_integers.py
import test_integers
test_integers.test_integers()
Run Code Online (Sandbox Code Playgroud)
我的Python详细信息,以防这与实现有关:
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Run Code Online (Sandbox Code Playgroud) 大家好我知道这段代码的作用:
1.]我的第一个问题
x = 4
y = x
Run Code Online (Sandbox Code Playgroud)
但是这个呢.为什么同样的地址甚至是这种情况?
x = 4
y = 4
id(x)
12345678
id(y)
12345678
Run Code Online (Sandbox Code Playgroud)
2.]我的第二个问题
x = 42
y = x
x = x + 1
print x # Prints 43
print y # Prints 42
x = [1, 2, 3]
y = x
x[0] = 4
print x # Prints [4, 2, 3]
print y # Prints [4, 2, 3]
Run Code Online (Sandbox Code Playgroud)
但为什么在名单的情况,都x与y得到了由命令突变在一起x[0] = 4.
在这样的行为中,列表有什么不同?
是什么让他们表现得像这样?
最重要的是,这种行为的好处是什么?
为什么不能列出,变量,元组具有彼此的所有属性?
我想比较两个列表的值.
例如:
a = [1, 2, 3]
b = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
我需要检查是否a相同b.我怎么做?
我对以下结果感到惊讶,使用Python 2.7.4:
>>> id(5)
5068376
>>> id(5)
5068376
Run Code Online (Sandbox Code Playgroud)
当评估表达式5时,创建一个具有5068376标识的新对象.现在,我希望重复相同的语句将创建另一个新对象,其标识将是唯一的,因为简单地评估表达式不会产生任何对对象和对象的引用应该是垃圾回收.
这并不是解释器重用相同的内存地址:
>>> id(6)
5068364
>>> id(5)
5068376
Run Code Online (Sandbox Code Playgroud)
什么给出了什么?翻译是否对文字进行幕后绑定?
我的代码是测试我试图弄清楚为什么p & ~(p & (p - 1))不测试2的指数.无论如何,解释器in = 1因为某种原因不喜欢while循环之前.
码:
def getnumber(str):
num=0
for i in str:
zz = ord(i)-48
if zz<0 or zz>9:
num=-1
break
else:
num=(num*10)+zz
return num
def testexp2(p):
table = {1:1,2:2,4:3,8:4,16:5,32:6,64:7,128:8,256:9}
if p & ~(p & (p - 1)):
print "yes"
else:
print "no"
in = 1
while in is not -1:
in = raw_input("> ")
in = getnumber(in)
if in>-1:
testexp2(in)
else:
print "\nDone\n\n"
Run Code Online (Sandbox Code Playgroud) python ×11
operators ×3
python-3.x ×2
identity ×1
int ×1
list ×1
literals ×1
name-binding ×1
python-2.7 ×1