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 · 2687 次点击
    这是一个创建于 1700 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    skymei  
       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 机制
    liprais
        12
    liprais  
       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   ·   实用小工具   ·   1076 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:57 · PVG 03:57 · LAX 11:57 · JFK 14:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.