这适用于Python 2.6.
我无法弄清楚为什么a和b是相同的:
>>> a = "some_string"
>>> b = "some_string"
>>> a is b
True
Run Code Online (Sandbox Code Playgroud)
但是如果字符串中有空格,则它们不是:
>>> a = "some string"
>>> b = "some string"
>>> a is b
False
Run Code Online (Sandbox Code Playgroud)
如果这是正常行为,有人可以解释发生了什么.
编辑:免责声明!这不用于检查相等性.我其实想向其他人解释"是"只是为了检查身份,而不是平等.从文档中我了解到以这种方式创建的引用将是不同的,每次都会创建一个新的字符串.当我无法证明自己的观点时,我给出的第一个例子就把我扔了!
编辑: 我知道这不是一个错误,实习对我来说是一个新概念. 这似乎是一个很好的解释.
从这个链接我了解到了
当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用
但是当我尝试为我的会话提供一些示例时,我发现它在赋值和元组解包时表现不同.
这是片段,
Python 2.7.2 (default, Oct 11 2012, 20:14:37)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a,b = 300,300
>>> a is b
True
>>> c = 300
>>> d = 300
>>> c is d
False
>>>
Run Code Online (Sandbox Code Playgroud) 为什么Python中返回True时,我比较int和float具有相同价值的物品?
例如:
>>> 5*2 == 5.0*2.0
True
Run Code Online (Sandbox Code Playgroud) 可能重复:
Python"is"运算符使用整数意外运行
昨晚做了什么奇怪的事情
if max_urls is 0:
max_urls = 10
Run Code Online (Sandbox Code Playgroud)
总是会返回false ...即使max_urls为0 ....它也是从数据库中分配的.当我做了一个
print type(max_urls)
Run Code Online (Sandbox Code Playgroud)
会回来的
<type 'long'> 0
Run Code Online (Sandbox Code Playgroud)
这似乎是正确的,但它总是会返回虚假.
如果我把它改成了
if max_urls == 0:
max_urls = 10
Run Code Online (Sandbox Code Playgroud)
那么当它为0时它最终会返回true.为什么==和之间的区别是?
为什么id'spython 2.7中的int变量只相等于256?
例如:
>>> y = 256
>>> m = 256
>>> m is y
True
>>> y = 257
>>> m = 257
>>> id(m)
16282096
>>> id(y)
16281952
>>> m is y
False
Run Code Online (Sandbox Code Playgroud) 试图在python中理解oop我遇到了困扰我的情况,我无法找到令人满意的解释......我正在构建一个Countable类,它有一个计数器属性,可以计算该类有多少个实例已初始化.我希望在初始化给定类的子类(或子类)时也增加此计数器.这是我的实现:
class Countable(object):
counter = 0
def __new__(cls, *args, **kwargs):
cls.increment_counter()
count(cls)
return object.__new__(cls, *args, **kwargs)
@classmethod
def increment_counter(cls):
cls.counter += 1
if cls.__base__ is not object:
cls.__base__.increment_counter()
Run Code Online (Sandbox Code Playgroud)
哪里count(cls)有调试目的,后来我把它写下来.
现在,让我们有一些这样的子类:
class A(Countable):
def __init__(self, a='a'):
self.a = a
class B(Countable):
def __init__(self, b='b'):
self.b = b
class B2(B):
def __init__(self, b2='b2'):
self.b2 = b2
def count(cls):
print('@{:<5} Countables: {} As: {} Bs: {} B2s: {}'
''.format(cls.__name__, Countable.counter, A.counter, B.counter, B2.counter))
Run Code Online (Sandbox Code Playgroud)
当我运行如下代码时:
a = A()
a = A()
a …Run Code Online (Sandbox Code Playgroud) 在尝试回答有关is关键字使用的问题时,我发现这段代码:
脚本:
a = 123456
b = 123456
print a is b # True
Run Code Online (Sandbox Code Playgroud)
互动模式:
>>> a = 123456
>>> b = 123456
>>> a is b
False
Run Code Online (Sandbox Code Playgroud)
在Python交互模式下以及从脚本运行时提供不同的输出.
从这个答案:
当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用.
所以,我希望只a is b返回True范围内的整数[-5, 256].但它只适用于交互模式,而不是从脚本运行时.
问题:为什么a is b在交互模式下以及何时从脚本运行时表现不同?
注意:在Python 2.7和Python 3中测试
测试替代for _ in range(n)(执行一些动作n时间,即使动作不依赖于值n)我注意到这种模式的另一种表现更快,for _ in [""] * n.
例如:
timeit('for _ in range(10^1000): pass', number=1000000)
Run Code Online (Sandbox Code Playgroud)
返回16.4秒;
然而,
timeit('for _ in [""]*(10^1000): pass', number=1000000)
Run Code Online (Sandbox Code Playgroud)
需要10.7秒.
为什么[""] * 10^1000比range(10^1000)Python 3 快得多?
所有测试都使用Python 3.3完成
运行:
a = 257
b = 257
print id(a) == id(b)
Run Code Online (Sandbox Code Playgroud)
结果是:
相同的陈述但相反的结果.为什么?
我可以id()在实践中依赖对象及其独特性多少?例如:
id(a) == id(b)意味着a is b反之亦然?对面怎么样?id以后要使用的某个地方(例如进入某个注册表而不是对象本身)有多安全?(作为对Canonicals for Python的响应而写成的规范:具有相同id()的对象是相同的对象,`is`运算符,未绑定的方法对象)
python ×10
python-2.7 ×5
cpython ×1
identity ×1
inheritance ×1
int ×1
integer ×1
python-3.x ×1
reference ×1
string ×1
variables ×1