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
SingeeKing
V2EX  ›  Python

一段有趣的代码

  •  
  •   SingeeKing ·
    ImSingee · 2018-05-11 00:04:39 +08:00 · 6360 次点击
    这是一个创建于 2149 天前的主题,其中的信息可能已经有所发展或是发生改变。
    def buggy(arg, result=[]):
        print(result)
        result.append(arg)
        print(result)
    
    buggy('a')
    buggy('b')
    buggy('c')
    

    学到了新知识……

    https://stackoverflow.com/questions/2335160/what-is-the-scope-of-a-defaulted-parameter-in-python

    27 条回复    2018-05-11 19:52:02 +08:00
    WilliamYang
        1
    WilliamYang  
       2018-05-11 00:12:09 +08:00
    是有多无聊?
    pwrliang
        2
    pwrliang  
       2018-05-11 00:13:51 +08:00 via Android   ❤️ 1
    我不认为这是无聊,这可能会是一个没有注意到的坑
    shihira
        3
    shihira  
       2018-05-11 00:23:24 +08:00
    对啊,函数的默认参数是属于静态变量来的,包括 doc 串

    ```
    def A():
    'i am A'
    pass
    help(A)
    a.__doc__ = "i am not A"
    help(A)
    ```
    raptor
        4
    raptor  
       2018-05-11 00:23:41 +08:00
    不要在参数默认值中使用引用类型这难道不应该是常识?
    lance6716
        5
    lance6716  
       2018-05-11 00:54:54 +08:00 via Android   ❤️ 1
    为什么要钻牛角尖…正常情况下根本不会出现这种代码
    aice114
        6
    aice114  
       2018-05-11 00:57:47 +08:00 via Android
    默认参数使用引用类型就是这样,以前看过一本 python 书还举了例子
    binux
        7
    binux  
       2018-05-11 01:01:48 +08:00
    @raptor #4 还真不是常识,比如 JS 就不是这样的。
    vegito2002
        8
    vegito2002  
       2018-05-11 02:14:51 +08:00
    我觉得这个还挺有意思的.
    OldPanda
        9
    OldPanda  
       2018-05-11 02:55:06 +08:00   ❤️ 1
    @raptor 所谓的常识都是这样踩坑踩出来的
    aijam
        10
    aijam  
       2018-05-11 04:25:10 +08:00   ❤️ 3
    这是 python 的知名坑
    FrankFang128
        11
    FrankFang128  
       2018-05-11 04:28:49 +08:00   ❤️ 1
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Default_parameters#%E4%BC%A0%E5%85%A5_undefined_vs_%E5%85%B6%E4%BB%96%E7%A9%BA%E5%80%BC
    在函数被调用时,参数默认值会被解析,所以不像 Python 中的例子,每次函数调用时都会创建一个新的参数对象。


    MDN 点名批评 Python
    aijam
        12
    aijam  
       2018-05-11 04:44:04 +08:00
    @FrankFang128 这句话写的看起来有歧义
    aipansiyouyun
        13
    aipansiyouyun  
       2018-05-11 07:12:10 +08:00 via Android   ❤️ 1
    又一个标题党
    ryuzaki113
        14
    ryuzaki113  
       2018-05-11 08:46:11 +08:00
    这个属于 Python 的坑,基本上都会踩到
    mimzy
        15
    mimzy  
       2018-05-11 09:00:21 +08:00
    通常推荐使用 None 代替。基本上每个 Python 教程都会提到这个问题 比如官方入门:

    https://docs.python.org/3/tutorial/controlflow.html#default-argument-values
    lolizeppelin
        16
    lolizeppelin  
       2018-05-11 09:24:42 +08:00 via Android
    IDE 会警告的啊
    siteshen
        17
    siteshen  
       2018-05-11 09:30:51 +08:00
    无数人讲过 python 默认参数的“坑”了,我提供另外一个思路,函数尽量不要有副作用。这样无论 python 内部怎么实现,都不会出现问题(当然如果是性能不足,肯定需要研究语言的实现机制)。
    ybping
        18
    ybping  
       2018-05-11 09:32:55 +08:00 via iPhone
    python 一切都是对象
    xlui
        19
    xlui  
       2018-05-11 09:34:47 +08:00 via iPhone
    @aice114 fluent Python 有讲过
    xiongshengyao
        20
    xiongshengyao  
       2018-05-11 09:38:45 +08:00
    最开始学 python 的时候,你看的入门书籍里没告诉过你不要这样写?
    glasslion
        21
    glasslion  
       2018-05-11 11:20:42 +08:00
    @binux 但对 python 来说是常识啊
    xmadi
        22
    xmadi  
       2018-05-11 11:22:31 +08:00 via iPhone
    我还以为这是常识 会写 python 都知道
    mulog
        23
    mulog  
       2018-05-11 12:01:10 +08:00
    每本 python 书应该都会讲到这个吧
    lihongming
        24
    lihongming  
       2018-05-11 12:34:07 +08:00 via Android   ❤️ 2
    每学一门新语言,我都会认真研究变量的作用范围。
    对 Python 来说,集合变量的作用范围是全局。
    我以为上面两句都是常识
    ech0x
        25
    ech0x  
       2018-05-11 12:40:39 +08:00 via iPhone
    这是坑,默认变量的坑……
    bravecarrot
        26
    bravecarrot  
       2018-05-11 13:35:43 +08:00
    Python 入门必采坑+1
    还有 深拷贝 浅拷贝
    可迭代对象的元素是列表等

    推荐 python cookbook,fluent python
    你会发现 有意思的事还有很多 2333
    hareandlion
        27
    hareandlion  
       2018-05-11 19:52:02 +08:00 via Android
    默认参数不用可变类型,不讲这个的新手教程都不是好书
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5290 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 07:16 · PVG 15:16 · LAX 00:16 · JFK 03:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.