美文网首页Python七号
Python 语言一些鲜为人知的特性

Python 语言一些鲜为人知的特性

作者: somenzz | 来源:发表于2019-03-22 23:41 被阅读15次

    这里的读者大部分都是因为 Python 来关注我的,今天我就再分享一些关于 Python 语言的有趣现象,帮助你更深入地理解和使用 Python。

    字符串

    先看几行代码

    1、

    >>> a = "some_string"
    >>> id(a)
    140420665652016
    >>> id("some" + "_" + "string") # 注意两个的id值是相同的.
    140420665652016
    

    2、

    >>> a = "wtf"
    >>> b = "wtf"
    >>> a is b
    True
    
    >>> a = "wtf!"
    >>> b = "wtf!"
    >>> a is b
    False
    
    >>> a, b = "wtf!", "wtf!"
    >>> a is b
    True
    

    3、

    >>> 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'
    True
    >>> 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'
    False
    

    很好理解,对吧?

    这里我在唠叨下:

    • id 是取一个对象在内存中的地址,id 一样,就是同一个对象。A 和 B 的 id 一样,那么 A is B 就是 True,否则就是 False。

    • 编译器(CPython)在编译优化时,某些情况下会尝试使用已经存在的不可变对象,而不是新创建一个新对象,这样可以节省内存。这种行为叫字符串的驻留。(到这里可以解释1)

    • 字符串中只包含字母、数字或下划线时将会驻留,所以 ‘wtf!' 由于包叹号,所以不被驻留,当在同一行将 a 和 b 的值设置为 "wtf!" 的时候, Python 解释器会创建一个新对象, 然后同时引用第二个变量. 如果你在不同的行上进行赋值操作, 它就不会“知道”已经有一个 wtf! 对象,它是一种编译器优化, 特别适用于交互式环境。(到这里你已经明白2的结果了)

    • 常量折叠是 Python 中的一种 窥孔优化(peephole optimization) 技术。这意味着在编译时表达式 'a'*20 会被替换为 'aaaaaaaaaaaaaaaaaaaa' 以减少运行时的时钟周期。只有长度小于 20 的字符串才会发生常量折叠。(到这里已经明白3的结果了)

    字典

    先看几行代码

    >>> some_dict = {}
    >>> some_dict[1.1] = "Ruby"
    >>> some_dict[1.0] = "JavaScript"
    >>> some_dict[1] = "Python"
    >>> some_dict[1.1]
    'Ruby'
    >>> some_dict[1.0]
    'Python'
    >>> some_dict[1]
    'Python'
    >>>
    
    • Python 字典通过检查键值是否相等和比较哈希值来确定两个键是否相同。

    • 具有相同值的不可变对象在Python中始终具有相同的哈希值。

      >>> 1 == 1.0
      True
      >>> hash(1) == hash(1.0)
      True
      

      注意: 具有不同值的对象也可能具有相同的哈希值(哈希冲突)。

    • 当执行 some_dict[5] = "Python" 语句时,因为Python将 55.0 识别为 some_dict 的同一个键,所以已有值 "JavaScript" 就被 "Python" 覆盖了。

    未完待续。

    相关文章

      网友评论

        本文标题:Python 语言一些鲜为人知的特性

        本文链接:https://www.haomeiwen.com/subject/oibdvqtx.html