推荐学习书目
› 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 · Apr 3, 2020 · 3880 views
    This topic created in 2412 days ago, the information mentioned may be changed or developed.
    x = 300
    
    def myfunc():
      x = 200
      print(x)
    
    myfunc()
    
    print(x)
    

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

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

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

    再试试看
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2361 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 13:05 · PVG 21:05 · LAX 05:05 · JFK 08:05
    ♥ Do have faith in what you're doing.