Python分号确实有所作为

时间:2015-03-05 17:19:38

标签: python

为什么使用冒号会对结果产生影响?什么应该是正确的结果?

# 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

但是同样的事情会返回false。

>>> x = '123 4'
>>> y = '123 4'
>>> id(x) == id(y)
False

在函数下返回True

>>> 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

4 个答案:

答案 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解释器(如CPythonIronPythonPyPy等)的行为可能会有所不同。它可以在版本之间进行更改。它甚至可能在运行之间发生变化。

要解决您的特定情况,需要分析给定版本的解释器的源代码。最好的办法是,处理一行中传递的语句(用分号分隔)并逐个执行它们的实现略有不同。

当以交互方式运行时,您需要记住,每行代码之间可能会发生很多事情 - 因为您可能想要检查它。当您一次性传递所有内容时,解释器确实不用担心语句之间可能发生的事情。

答案 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差异。因为'是'将值与地址位置进行比较,其中' =='直接与参考值比较。但是,在不可变对象的情况下,它不会给出错误,因为所有指向同一位置,但是如果值可以更改,则变量会指向当前对象,因此会给出错误的结果。

希望这会有所帮助:)