为什么使用冒号会对结果产生影响?什么应该是正确的结果?
# Not stored in a different location.
>>> id('123 4')== id('123 4')
True
# Also returns true
>>> x = '123 4'; y ='123 4'; id(x) == id(y)
True
>>> x = '123 4'
>>> y = '123 4'
>>> id(x) == id(y)
False
>>> def test():
... x = '123 4';y='123 4'; print (id(x)==id(y))
... a = '123 4'
... b='123 4'
... print (id(a)==id(b))
...
>>> test()
True
True
答案 0 :(得分:8)
>>> x="123 4";y="123 4"
Python非常聪明,可以识别两个变量获得相同的值(因为它们被解释在同一行中),因此将该值存储在同一个内存位置(即id(x) == id(y)
)。
然而
>>> x="123 4"
>>> y="123 4"
Python不够聪明,无法意识到它们都是相同的值(因为它们在不同的行上解释),因此将每个值存储在自己的内存位置(即id(x) != id(y)
)。
答案 1 :(得分:4)
这只是编写解释器的意外。在脚本中执行相同操作会显示不同的结果。在我看来,字符串内容就像编译单元一样发生。
(添加stuff2.py以显示多个模块)
stuff2.py:
z = '123 4'
stuff.py:
x = '123 4';y='123 4';print id(x)==id(y)
x = '123 4'
y='123 4'
print id(x)==id(y)
import stuff2
print id(x)==id(stuff2.z)
$ python stuff.py
True
True
False
答案 2 :(得分:0)
嗯,很明显,这与Python中的字符串实习相关。此机制与实现有关,因此任何Python解释器(如CPython,IronPython,PyPy等)的行为可能会有所不同。它可以在版本之间进行更改。它甚至可能在运行之间发生变化。
要解决您的特定情况,需要分析给定版本的解释器的源代码。最好的办法是,处理一行中传递的语句(用分号分隔)并逐个执行它们的实现略有不同。
当以交互方式运行时,您需要记住,每行代码之间可能会发生很多事情 - 因为您可能想要检查它。当您一次性传递所有内容时,解释器确实不用担心语句之间可能发生的事情。
答案 3 :(得分:0)
如果在python中为变量分配一个不可变对象,那么该变量以及该值指向同一位置,
>>> a = 5
>>> b = 5
>>> id(5)
11372376
>>> id(a)
11372376
>>> id(b)
11372376
>>> a == b
True
>>> a is b
True
ID比较将完全正常,因为您可以看到ID值。 现在让我们尝试将可变对象分配给python变量。
>>> x = '123 4'
>>> y = '123 4'
>>> x == y
True
>>> x is y
False
>>> id(x)
21598832
>>> id(y)
21599408
>>> id('123 4')
21599312
您可以在此处查看ID差异。因为'是'将值与地址位置进行比较,其中' =='直接与参考值比较。但是,在不可变对象的情况下,它不会给出错误,因为所有指向同一位置,但是如果值可以更改,则变量会指向当前对象,因此会给出错误的结果。
希望这会有所帮助:)