有没有大佬讲讲 while 和 for 的区别, 写一个带参数的装饰器时遇到个问题, 用 while 就获取不到参数但是用 for 可以 - V2EX
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
Hstar
V2EX    Python

有没有大佬讲讲 while 和 for 的区别, 写一个带参数的装饰器时遇到个问题, 用 while 就获取不到参数但是用 for 可以

  •  
  •   Hstar 2017 年 10 月 11 日 3271 次点击
    这是一个创建于 3058 天前的主题,其中的信息可能已经有所发展或是发生改变。

    环境 python3.6.2

    代码 gist

    把情景写错最简化的 demo 丢在 gist 上了. 只有 gistfile2.py 用 for 循环是能跑通的, 1 和 3 是用 while 做循环都提示那个参数未定义, 表现为代码一进入 while 代码块立马就失去了这个变量, 在 while 之前还是能获取到.

    查资料查了半天没查出什么区别, 搜 difference between while and for 搜出一打入门教程. 所有文章都说 while 和 for 只有表现区别没有深层区别, 编译后结果是一样的. 那么我遇到的这个什么情况.

    8 条回复    2017-10-12 08:20:35 +08:00
        1
    WangYanjie  
       2017 年 10 月 11 日
    不要 retry_time -= 1
    JackeyGao
        3
    JackeyGao  
       2017 年 10 月 11 日
    不知道为什么, 但可以在条件外部重新定义 retry_time。 下面逻辑可以跑通, 如果你知道原因也请告诉我一下。。doge)

    ```python
    # -*- coding: utf-8 -*-
    import time
    from functools import wraps


    def retry(retry_time=10):
    def retry_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
    result = func(*args, **kwargs)
    n = retry_time
    while result is None and n >= 0:
    result = func(*args, **kwargs)
    time.sleep(0.5)
    n -= 1
    return result

    return wrapper

    return retry_decorator


    @retry(5)
    def test(a, b=1):
    print(a, b)
    return None


    if __name__ == '__main__':
    test(4)
    ```

    参考:
    https://stackoverflow.com/questions/39990133/while-loop-unboundlocalerror-local-variable-referenced-before-assignment
    lolizeppelin
        4
    lolizeppelin  
       2017 年 10 月 11 日
    不是 while 和 for 的问题

    原因在于
    https://cyrusin.github.io/2016/03/11/python-closure-20160311/
    WangYanjie
        5
    WangYanjie  
       2017 年 10 月 11 日
    @lolizeppelin 不赞同你的看法,我认为是:
    If you want to simply access a global variable you just use its name. However to change its value you need to use the global keyword.
    Hstar
        6
    Hstar  
    OP
       2017 年 10 月 11 日
    @WangYanjie @lolizeppelin 感谢两位的提醒, 的确是是因为全局变量在代码中重新绑定被视为局部变量的原因. 之前我也想到过这个问题, 但是在 while True 上一行能 print(retry_time)成功, 所以 pass 了这种可能性.
    现在无论是声明 nolocal retry_time 还是 inner_retry_time = copy.deepcopy(retry_time), 确定 retry_time 不会在下方代码中重新绑定, 就可以跑通.
    lolizeppelin
        7
    lolizeppelin  
       2017 年 10 月 12 日 via Android
    要搞清楚,不是全局变量 ,是自由变量
    好好看闭包的说明
    akiakiseofficial
        8
    akiakiseofficial  
       2017 年 10 月 12 日 via iPhone
    流畅的 Python 7.5 7.6 讲了闭包和 nolocal 的使用,我觉得讲的不错,你可以去看看。7.4 讲了变量作用域规则,其中提到了,**Python 不要求声明变量,但是假定在函数定义体中赋值的变量是局部变量**,这也是你报错 retry_time 未定义的原因。因为代码下方对他进行了赋值,所以 Python 认定他是局部变量,而你在局部变量未被赋值前引用了他。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5273 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 08:12 PVG 16:12 LAX 00:12 JFK 03:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86