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