为什么 Python 不是 lexical scoping?
程序员文章站
2022-05-08 16:57:07
...
这似乎背离了现代程序设计语言的一般设计思路。
比如
按照python的LEGB(Local,Enclosing,Global,Built-in)规则,当调用inner()时,x实际上是在foo的scope中找到的。inner之所能够访问foo中的x,是因为inner is inside the text of foo,这正是lexical的含义。
Bash是Dynamic Scoping的
这和scoping没有关系。
C++的lambda就可以选择capture by copy或者capture by reference. 根据之前阅读Python源码的经验(如果记错请指正),在题主的例子里面,这个inner是一个闭包。闭包在Python里面的实现方式是保存一个通往外部namespace的指针(可以理解成一个dictionary)。
楼主可以参看这个例子
第一个例子结果都是一样的,因为变量绑定的是引用而不是值。第二个例子:
输出感觉当前 x 走的 這個問題很好回答:x是inner函數的環境變量,所以在inner的定義中出現的x其實就是對定義外面的,也就是inner的環境變量的一個引用而已。
函數只有在被調用的時候才會執行,你前面將置為1,後面又改為3,不過是改變了x的引用值而已,相當於給x重新賦值。然後執行inner函數,使用x所對應的值為3,因此答案就是4了。
比如
def foo(): x = 1 def inner(): return x + 1 x = 3 print inner()
回复内容:
这段代码是lexical scoping,静态作用域是指我们可以根据代码文本的位置,确定变量的存在区域。按照python的LEGB(Local,Enclosing,Global,Built-in)规则,当调用inner()时,x实际上是在foo的scope中找到的。inner之所能够访问foo中的x,是因为inner is inside the text of foo,这正是lexical的含义。
Bash是Dynamic Scoping的
x=1
function g () { echo $x ; x=2 ; }
function f () { local x=3 ; g ; }
f #f中的g执行时打印出的x是3而不是1
echo $x #这时打印出的x是1
你以为Python是let foo () =
let x = 1 in
let inner () = x + 1 in
let x = 3 in
print (inner ())
python的闭包里的*变量是按引用传递的,而不是按值传递,所以会有这个结果。这和scoping没有关系。
C++的lambda就可以选择capture by copy或者capture by reference. 根据之前阅读Python源码的经验(如果记错请指正),在题主的例子里面,这个inner是一个闭包。闭包在Python里面的实现方式是保存一个通往外部namespace的指针(可以理解成一个dictionary)。
楼主可以参看这个例子
def foo():
def inner():
return x + 1
x = 1
print inner() # output 2
x = 2
print inner() # output 3
这分明就是lexical scoping嘛,譬如说等价的C#代码
void Foo()
{
int x=1;
Funcint> inner = ()=>x+1;
x=3;
Console.WriteLine(inner());
}
把楼主的代码改写成 lua 可以看看 Python 和 Lua 在处理上的不同:第一个例子结果都是一样的,因为变量绑定的是引用而不是值。第二个例子:
function foo()
function inner()
return x + 1
end
local x = 3
print(inner())
end
foo()
题主所说的 现代化的编程语言指的是什么? js经过这么多代的更新迭代,现在也是这样~(function foo() {
function inner() {
return x+1;
}
x = 3;
console.log(inner());
})();
def foo():
x = 1
def inner():
return x + 1
x = 3
print inner()
foo()
# 输出4
我觉得完全没有背离啊。。输出感觉当前 x 走的 這個問題很好回答:x是inner函數的環境變量,所以在inner的定義中出現的x其實就是對定義外面的,也就是inner的環境變量的一個引用而已。
函數只有在被調用的時候才會執行,你前面將置為1,後面又改為3,不過是改變了x的引用值而已,相當於給x重新賦值。然後執行inner函數,使用x所對應的值為3,因此答案就是4了。
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
相关文章
相关视频
专题推荐
-
独孤九贱-php全栈开发教程
全栈 170W+
主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门
-
玉女心经-web前端开发教程
入门 80W+
主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门
-
天龙八部-实战开发教程
实战 120W+
主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习
上一篇: 爬虫中进行数据清洗
推荐阅读
-
为什么入门大数据选择Python而不是Java?
-
简述:我为什么选择Python而不是Matlab和R语言
-
为什么中国的 Ruby 和 Python 活动大多在上海而不是北京?
-
资深程序员告诉你为什么要用Python3而不是Python2
-
为什么在python里推荐使用多进程而不是多线程?--转同事的一篇文章
-
为什么在python里推荐使用多进程而不是多线程?--转同事的一篇文章_PHP教程
-
为什么在python里推荐使用多进程而不是多线程?--转同事的一篇文章
-
为什么在python3里b=a=1是合理表达式,而print(a=1)却不是。a=1为什么没有返回值?
-
在python里面,为什么len()就是把对象写在括号里,而lower()就是把对象写在前面,而不是括号里?
-
为什么 Python 不是 lexical scoping?
网友评论
文明上网理性发言,请遵守 新闻评论服务协议
我要评论