我知道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