Python中有趣的特性
- 2019 年 10 月 6 日
- 筆記
奇妙的字符串
# 1、 In [1]: a = "some_string" In [2]: id(a) Out[2]: 1741734895024 In [3]: id("some"+"_"+"string") Out[3]: 1741734895024 # id是相同的 # 2、 In [4]: a = "wtf" In [5]: b = "wtf" In [6]: a is b Out[6]: True In [7]: a = "wtf!" In [8]: b = "wtf!" In [9]: a is b Out[9]: False ''' 这里涉及到python 的字符串驻留机制(为了节省内存)。 python的字符串驻留机制,并不是对所有的数字,字符串,他只对“ [0-9] [a-z] [A-Z]和"_"(下划线) ”有效, 当字符串中由其他字符比如“!@ # ¥ % -”时字符驻留机制是不起作用的。 我们都知道is比较的是对象,而==比较的是值,当字符串中含有!@ # ¥ % -”的是否,字符驻留机制不起作用,此时就会是 两个不同的引用。就会看到如上效果。 ''' # 3、 In [10]: 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa' Out[10]: True In [11]: 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa' Out[11]: False ''' 出现这样的现象是因为常量折叠,是编译器的优化,当长度小于20,会被替换成'aaaaaaaaaaaaaaaaaaaa', 来减少运行的周期,只有长度小于20才会发生常量折叠。 ''' # 4、 In [12]: some_dict = {} In [13]: some_dict[6] = "Java" In [14]: some_dict[5.0] = "Python" In [15]: some_dict[5] = "C#" In [16]: some_dict[6] Out[16]: 'Java' In [17]: some_dict[5.0] Out[17]: 'C#' In [18]: some_dict[5] Out[18]: 'C#' In [19]: some_dict Out[19]: {6: 'Java', 5.0: 'C#'} ''' 可以看到some_dict[5.0]被some_dict[5]覆盖掉了,在python字典中是通过比较键值是否相同和比较哈希值是否相等 来确定key是否相同。 由于 In [20]: 5 == 5.0 Out[20]: True In [21]: hash(5) == hash(5.0) Out[21]: True 所以前者就会被后者替换。 '''
返回值
In [22]: def some_func(): ...: try: ...: return "from_try" ...: finally: ...: return "from_finally" In [23]: some_func() Out[23]: 'from_finally' # 返回的是finally中的值。
评估时间的差异
# 1、 In [33]: array = [1,2,3] In [34]: g = (x for x in array if array.count(x) > 0) In [35]: array = [1,5,6] In [36]: list(g) Out[36]: [1] ''' 原因:in语句是在声明的时候执行,而if语句是运行时执行。 也就是说in后面的array是[1,2,3]而if后的array是[1,5,6] ''' # 2、赋值方式带来的不同 In [37]: array_1 = [1,2,3] In [38]: g1 = (x for x in array_1) In [39]: array_1 = [1,2,3,4] In [40]: list(g1) Out[40]: [1, 2, 3] In [41]: array_2 = [1,2,3] In [42]: g2 = (x for x in array_2) In [43]: array_2[:] = [1,2,3,4] In [44]: list(g2) Out[44]: [1, 2, 3, 4] ''' 切片操作更新了array_2的值,所以有所不同。 '''