python 和 js 变量作用域问题的不理解
本人目前刚学习python
, 遇到了关于变量作用域的一些问题, 如下:
下面这个就不是非常明白
a = 3
def f():
a += 4
print(a)
f() # UnboundLocalError: local variable 'a' referenced before assignment
然后如果稍微改一下:
a = 3
def f():
b = a + 4
print(a)
f() # 3
这里新声明了一个变量b
, 对a
进行了引用, 然后就可以访问到a
了, 不是明白为什么
另外如果将代码 1 换成js
, 结果又不同
var a = 3
const f = () => {
a += 4
console.log(a)
}
a() // 7
f() // 7
在js
中不仅仅能够访问到全局变量, 甚至可以对全局变量进行修改, 所以在js
里面作用域机制和python
又有什么区别?
另外, 本人所了解到js
与python
都是静态作用域, 原理应该相同, 但是上面显示的结果却很不一样, 麻烦能有前辈清楚的解答一下, 本人才学疏浅, 见谅!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(2)
半边脸i2022-09-14 19:56:45
在 python
中
a += 4 其实就是a = a + 4
此时 相当于在函数内部声明了变量 a, 所以是调用不到外部的a的。
而在 js 中 a 并不是声明的新变量,所以结果会不同。
js 中声明变量是需要 var
之类的关键字的,python 不需要
如果想要python 中的 a 的指向全局需要明确指定
a = 3
def f():
global a // 明确指定是全局变量
a += 4
print(a)
f()
python 的代码转换为 js 代码其实是这样的:
var a = 3;
const f = () => {
var a;
a += 4;
console.log(a) // NaN 因为js的容错机制,所以并没有报错。
}
~没有更多了~
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我来给你解释一下吧,
对于举例中的python和js中var定义的变量,他们作用域规则相似
不同点
var
(我们先不讨论let和const),否则就是直接调用全局的global 变量名
基于以上前提知识,请看注释中的解释
Python的代码
Javascript的代码