对基于赋值方法返回不同输出的字符串进行身份检查

时间:2014-09-15 13:24:07

标签: python string python-2.7

我知道Python实习生某些字符串并在字符串以字母或下划线开头并且只包含Martijn Pieters codementor interview中所示的字母,下划线或数字时创建哈希。

单独分配s = "$foo"s1 = "$foo" s is s1按预期返回False但使用s, s1 = "$foo", "$foo" s is s1返回True。< / p>

为什么python使用不同的赋值表现不同?

In [1]: s, s1 = "$foo", "$foo"    
In [2]: s is s1
Out[2]: True   
In [3]: s1 = "$foo"    
In [4]: s = "$foo"    
In [5]: s is s1
Out[5]: False

1 个答案:

答案 0 :(得分:2)

正如Martijn Pieters所说,在你提到的文章中:

  

如果字符串以字母或下划线开头且仅包含   字母,下划线或数字,Python将实习字符串

您的特定字符串包含$,因此会被实习 - 此处发生的事情与字符串实习无关。

发生的事情是,解释器看到你创建了对相等的不可变对象的两个引用。由于对象类型是不可变的,因此一个简单的优化不是创建两个对象,而只是选择重用一个对象。

测试我们的理论:

In [41]: a=1000

In [42]: b=1000

In [43]: a is b
Out[43]: False

In [44]: a,b=1000,1000

In [45]: a is b
Out[45]: True

请注意,这只是因为交互式解释器必须编译(并评估)您单独输入的每一行。如果将这些语句放入脚本并执行它,结果就完全不同了,因为编译器可以处理整个代码,并注意到它:

a=1000
b=1000

print a is b

a,b=1000,1000

print a is b

输出:

True
True