首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

python2 输出问题

  •  
  •   FarewellRain · 78 天前 · 574 次点击
    这是一个创建于 78 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:22:17) [MSC v.1500 32
    tel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> a = 123456789.123456
    >>> a
    123456789.123456
    >>> print(a)
    123456789.123
    >>>

    请问为什么直接打印变量和 print 变量不一样
    3 回复  |  直到 2018-07-17 00:30:25 +08:00
        1
    JHerschel   78 天前   ♥ 2
    直接打印是调用 a 对象的 __repr__() 方法,print(a) 是调用 a 对象的 __str__() 方法。

    这两个方法的具体实现可以看这里啦:

    http://svn.python.org/projects/python/trunk/Objects/floatobject.c

    搜索 " PyOS_double_to_string() "。
        2
    NobodyVe2x   76 天前
    Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> a = 123456789.123456
    >>> a
    123456789.123456
    >>> print(a)
    123456789.123456
        3
    careofzm   71 天前
    这个东西尝试看了一原码
    ```
    def __repr__(self, *args, **kwargs): # real signature unknown
    """ Return repr(self). """
    pass
    ```
    根据注释我们可以看出,返回的是 repr(self)
    于是我们在去找找 repr 方法
    ```
    def repr(obj): # real signature unknown; restored from __doc__
    """
    Return the canonical string representation of the object.

    For many object types, including most builtins, eval(repr(obj)) == obj.
    """
    pass
    ```
    翻译大致是说:
    返回对象的规范字符串表示形式。
    对于许多对象类型,包括大多数内置函数,eval(repr(obj))== obj

    所以我尝试使用 repr 和 str
    ```
    >>> a = 123456789.123456
    >>> repr(a)
    '123456789.123456'
    >>> str(a)
    '123456789.123'
    ···
    再看看控制台输出
    ···
    >>> a
    123456789.123456
    >>> print a
    123456789.123
    ···
    然后我们在使用 eval
    ···
    >>> eval(repr(a))
    123456789.123456
    >>> eval(str(a))
    123456789.123
    ```
    这样大致上可以断定控制台上
    普通显示:
    a 相当于 eval(repr(a))
    print a 相当于 eval(str(a))
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1125 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 19ms · UTC 17:16 · PVG 01:16 · LAX 10:16 · JFK 13:16
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1