根据赋值方法对返回不同输出的字符串进行标识检查



我知道Python实习生某些字符串,如果字符串以字母或下划线开头,并且只包含字母、下划线或数字,则会创建一个哈希,如Martijn Pieters codementor访谈中所示。

当分别分配s = "$foo"s1 = "$foo"时,s is s1按预期返回False,但使用s, s1 = "$foo", "$foo"s is s1返回True

为什么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

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

最新更新