【问题标题】:Block Scoping in python - is it similar to javascript hoisting when inside a function?python中的块作用域-在函数内部是否类似于javascript提升?
【发布时间】:2023-03-28 04:41:01
【问题描述】:

我目前正在尝试理解python中的这段代码

def foo(a):
  if a==12:
    var = "Same"
  else:
    var = "different"

我阅读并理解 python 不支持基于块的作用域这一事实。因此,在函数内创建的所有内容(无论是在循环内还是在条件语句内)都对函数的其他成员公开可用。我还阅读了范围规则here。在这一点上,假设这些内部作用域变量在函数内部被提升,就像它们在 javascript 中被提升一样吗?

【问题讨论】:

  • 好吧,Python 并没有完全从变量声明开始,因此很难与 javascript 的 var 提升进行比较。我知道你可以在给 x 赋值之后添加一个global x 声明,它仍然可以工作,但这有点像苹果和橘子。
  • @jamesfranco -- 假设永远不安全。你为什么不启动你的 python 解释器并找出答案?
  • @Kevin 除了 var 关键字之外,Python 的声明(或缺少声明)与 Javascript 有何不同?

标签: javascript python


【解决方案1】:

你明白了。在函数内部分配的任何未使用 global 显式声明的名称(Py3 添加 nonlocal 以表明它不在本地范围内,而是查看包装范围而不是直接跳转到全局范围)是来自的局部变量函数的开头(它在本地数组中保留了空间),但在赋值之前读取它会引发UnboundLocalError

【讨论】:

  • 这似乎也适用于顶级“模块”级别。我现在正在阅读一个引用文件中定义的变量(碰巧是单例)的类(!)
  • @GreenAsJade:只有在函数范围内引用变量时才合法(因为函数在定义时实际上并没有执行,并且在调用时会懒惰地查找它们的全局变量)。如果在定义之前在全局或类定义范围内引用它,则会失败。
猜你喜欢
  • 2011-11-22
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 2012-01-06
  • 2011-03-27
  • 2021-01-04
相关资源
最近更新 更多