Python 小问题 - 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
v2byy
V2EX    Python

Python 小问题

  •  
  •   v2byy 2020-04-03 17:25:18 +08:00 3131 次点击
    这是一个创建于 2084 天前的主题,其中的信息可能已经有所发展或是发生改变。
    x = 300 def myfunc(): x = 200 print(x) myfunc() print(x) 

    有点难以理解,为什么 python 对于变量的 scope 为什么是这样,在函数里 assign 竟然操作的不是同一个对象? 感觉跟其他编程语言都不一样啊

    15 条回复    2020-04-08 14:04:56 +08:00
    fzzff
        1
    fzzff  
       2020-04-03 17:30:14 +08:00
    作用域嘛,也不难理解吧
    HashV2
        2
    HashV2  
       2020-04-03 17:31:28 +08:00   2
    这有什么难理解的吗? 你之前写前端的吗?
    raymanr
        3
    raymanr  
       2020-04-03 17:32:51 +08:00
    函数内不能修改外部变量, 需要修改的话函数内使用 global 关键字
    skymei
        4
    skmei  
       2020-04-03 17:33:26 +08:00
    emmm.. 有啥难理解的 作用域
    v2byy
        5
    v2byy  
    OP
       2020-04-03 17:33:53 +08:00
    @HashV2 好吧,我想说的是:在静态语言中,在函数中相当于定义了一个新的变量的话,是很好理解。
    Vegetable
        6
    Vegetable  
       2020-04-03 17:35:43 +08:00   1
    你说的其他语言,应该是有声明变量的关键词的,比如 var const let 等等, 声明和赋值姑且算两步吧.
    python 里只有一个等号,要完成两件事情. 大部分时候解释器都知道你是想赋值还是想声明, 没有变量就先声明变量再赋值, 有变量就直接赋值.
    但是你的例子里,出现两个作用域, 这时候函数内部作用域可以使用外部的 x, 也可以重新声明一个 x,出现了歧义. 解释器无法判断(假如没有后边的关键字)你到底是想赋值还是想声明变量再赋值.
    因此 python 用于两个关键字来解决这个问题:global 和 nonlocal

    https://docs.python.org/zh-cn/3/reference/simple_stmts.html#the-global-statement
    superrichman
        7
    superrichman  
       2020-04-03 17:53:15 +08:00   1
    其实其他语言都是这样的,真正奇怪的那个是 js 。。。
    v2byy
        8
    v2byy  
    OP
       2020-04-03 18:04:23 +08:00
    @Vegetable 谢谢回复。如果是静态语言,在 main 以外的 declaration 就算是 global 变量了,这样不管在函数里 definition,也就是在函数里赋值的话,会影响这个 global 变量。我开始以为 python 在函数里直接给一个已经声明的变量赋值,是可以改变这个"global"变量的。
    black11black
        9
    black11black  
       2020-04-03 18:06:52 +08:00
    @v2byy 看来 es6 不应该修正作用域问题,应该照你所说的“静态语言”来设计 ┓(`)┏
    smallpython
        10
    smallpython  
       2020-04-03 18:17:26 +08:00
    如果不是这样设计的话, 就很有可能你在你自己写的函数里修改了其他函数里变量的值, 岂不是很危险嘛
    fkdtz     11
    fkdtz  
       2020-04-03 18:20:59 +08:00
    python 的话,看看 LEGB 还有 COW 机制
    F281M6Dh8DXpD1g2
        12
    F281M6Dh8DXpD1g2  
       2020-04-03 23:56:58 +08:00
    楼主你猜猜这段代码里面打印出来啥
    a = [1,2,3]
    i = 0
    for i in a:print(i)
    print(i)
    drizztdu
        13
    drizztdu  
       2020-04-04 00:29:40 +08:00
    @liprais #12 和匿名函数中的变量绑定一个意思。
    Gakho
        14
    Gakho  
       2020-04-04 08:11:26 +08:00
    函数内修改外部变量,不是怪胎 JS 的设计吗?
    zhanlingjie
        15
    zhanlingjie  
       2020-04-08 14:04:56 +08:00
    def func():
    global a
    a = 6

    再试试看
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3012 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 13:24 PVG 21:24 LAX 05:24 JFK 08:24
    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