Answers:
就是这样is:x is y返回Trueif x和y是否为同一对象。
x is z返回False。但是,如果给x和z分配了相同的值而不是列表(例如x, z = 13, 13),则x is z返回True。这是为什么?
x和zpoint。由于小整数很常见(错误值为-1,因此每次实际索引时为0,小数通常是合理的默认值),Python通过预分配小数(-5至256)进行优化,并重用相同的整数对象。因此,您的示例仅适用于此范围内的数字。尝试分配更大的值,即270。有关更多信息
is检查两个名称是否引用相同的存储位置。它与对象本身无关。拥有不变的对象(如字符串)很容易,这些对象相等但不存储在同一位置,例如''a'*10000 is 'a' * 10000False。
"af" is "af"或() is ()...为什么它们共享相同的内存位置?
y is x会True,y is z会False。
虽然两个正确的解决方案x is z,并id(x) == id(z)已经公布,我想指出的Python的实现细节。Python将整数存储为对象,作为一种优化,Python会在其开始处生成一堆小整数(-5到256),并将每个具有小整数的变量指向每个预初始化的对象。更多信息
这意味着对于初始化为相同小数(-5到256)的整数对象,检查两个对象是否相同将返回true(就我所知这是一个实现细节,在ON C-Pyhon上),而对于较大的对象数字,仅当一个对象从另一个对象初始化时,它才返回true。
> i = 13
> j = 13
> i is j
True
> a = 280
> b = 280
> a is b
False
> a = b
> a
280
> a is b
True
您还可以使用id()来检查每个变量名称所引用的唯一对象。
In [1]: x1, x2 = 'foo', 'foo'
In [2]: x1 == x2
Out[2]: True
In [3]: id(x1), id(x2)
Out[3]: (4509849040, 4509849040)
In [4]: x2 = 'foobar'[0:3]
In [5]: x2
Out[5]: 'foo'
In [6]: x1 == x2
Out[6]: True
In [7]: x1 is x2
Out[7]: False
In [8]: id(x1), id(x2)
Out[8]: (4509849040, 4526514944)
我真的很想收到视觉反馈,这就是为什么有时我只打开http://www.pythontutor.com/visualize.html#mode=edit来查看内存分配方式以及引用什么的原因。
添加了这个很棒的gif,因为此回复是关于可视化的。