V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
RedFlag2233
V2EX  ›  Python

Python 字符串存储的问题??

  •  
  •   RedFlag2233 · 2018-05-21 21:54:37 +08:00 · 2864 次点击
    这是一个创建于 2376 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如图: 如图

    In [12]: a = "abc"
    
    In [13]: b = "abc"
    
    In [14]: a is b
    Out[14]: True
    
    In [15]: a = "ab c"
    
    In [16]: b = "ab c"
    
    In [17]: a is b
    Out[17]: False
    
    In [18]: 
    
    
    

    问题:

    • a = "abc" 与 b = "abc" a 和 b 都指向了同一块内存,为什么中间加一个空格就不一样了
    • 空格在 python 中是怎么存储的。
    • 看了一篇博客,说是享元模式,但还是对加一个空格就不是同一个对象这里不了解 希望懂的老哥,指导一下 :)
    16 条回复    2018-05-22 08:40:15 +08:00
    RedFlag2233
        1
    RedFlag2233  
    OP
       2018-05-21 22:18:05 +08:00 via Android
    困惑一下午了
    RedFlag2233
        2
    RedFlag2233  
    OP
       2018-05-21 22:18:35 +08:00 via Android
    为什么我发帖总是没有人会?唉!
    gjquoiai
        3
    gjquoiai  
       2018-05-21 22:20:53 +08:00
    是不是同一个对象是 is 告诉你的,返回 False 就说明不是同一个了呗
    RedFlag2233
        4
    RedFlag2233  
    OP
       2018-05-21 22:23:30 +08:00 via Android
    @gjquoiai 我知道不是啊,但为什么加了一个空格就不是一个对象了?
    SimbaPeng
        5
    SimbaPeng  
       2018-05-21 22:26:37 +08:00
    cpython 对简单的不可变对象做了优化,复用已经存在的对象,估计加了空格的字符串不在复用范围内。怎么存储是 python 解释器实现的问题,你不能把解释器的实现机制当做一个确保的事情,因为可能在下个版本的解释器、或者不同的解释器会有不同的实现方案,所以你写的代码肯定不能依赖于解释器的实现机制。
    alvin666
        6
    alvin666  
       2018-05-21 22:27:27 +08:00 via Android
    python 的一个 feature,短字符串在内存中复用,长的不复用,is 和==是不一样的,is 是看指针是否指向内存中同一位置,==是判断两个指针指向的是否相同。
    ctrlaltdeletel
        7
    ctrlaltdeletel  
       2018-05-21 22:29:50 +08:00
    还有类似的

    ```
    In [1]: a = 1

    In [2]: b = 1

    In [3]: a is b
    Out[3]: True

    In [4]: a = 123123123

    In [5]: b = 123123123

    In [6]: a is b
    Out[6]: False
    ```
    gjquoiai
        8
    gjquoiai  
       2018-05-21 22:30:06 +08:00
    忘记在哪听说 cpython 会复用 3 个字母以内的字符串,不过没从文档里找到,可能源码里有吧
    纠结这个有什么用么 = =
    wcsjtu
        9
    wcsjtu  
       2018-05-21 22:30:19 +08:00 via Android   ❤️ 1
    字符串池,internal 机制。看看 Python 源码解析前几章就明白了
    RedFlag2233
        10
    RedFlag2233  
    OP
       2018-05-21 23:20:04 +08:00 via Android
    @wcsjtu 好的,我去看看,谢谢老哥
    zhantss
        11
    zhantss  
       2018-05-21 23:27:52 +08:00
    源代码注释里面有说到相关的,我随便找了一个好贴,Python identifiers 会作为 intern 的判断条件,空格不属于,然后另外 size 为 0 和 1 的会 intern
    https://github.com/wklken/Python-2.7.8/blob/master/Include/stringobject.h#L30
    只能说源码实现是这样的
    我测试了一下不是交互控制台执行的情况,a is b 是 True
    MrGba2z
        12
    MrGba2z  
       2018-05-21 23:35:02 +08:00
    codergrowing
        13
    codergrowing  
       2018-05-21 23:40:04 +08:00 via Android
    因为 Python 的驻留( interning )机制。

    对于常用字符构成的字符串( 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz ),Python 会采用驻留机制,字符串在内存中只有一份,所以 id 相等。
    当你加了空格后,空格不属于驻留机制的范围,故生成了新的对象。
    codergrowing
        14
    codergrowing  
       2018-05-21 23:40:45 +08:00 via Android
    整数同样有驻留机制,范围是- 5 ~ 256
    secsilm
        15
    secsilm  
       2018-05-21 23:47:34 +08:00
    [Why does a space affect the identity comparison of equal strings? [duplicate]
    ]( https://stackoverflow.com/questions/28329498/why-does-a-space-affect-the-identity-comparison-of-equal-strings)

    我猜 @codergrowing 是参考了这个?
    codergrowing
        16
    codergrowing  
       2018-05-22 08:40:15 +08:00 via Android
    @secsilm 不是😂,最早看到驻留机制是在流畅的 Python 里,后来在知乎上看到有人问类似的问题就顺手写了个回答~
    https://www.zhihu.com/question/266183846/answer/304087286
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   990 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 21:15 · PVG 05:15 · LAX 13:15 · JFK 16:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.