问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么 Python 不是 lexical scoping

发布网友 发布时间:2022-05-11 02:16

我来回答

2个回答

懂视网 时间:2022-05-11 06:37

这似乎背离了现代程序设计语言的一般设计思路。

比如

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;
 Func 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了。

热心网友 时间:2022-05-11 03:45

这段代码是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

g并没有在f中定义,而只是在f中调用,但是却可以访问f中local variable的值,这是由于dynamic scoping。
王垠也在一篇文章中给出过emacs lisp的dynamic scoping的例子
我们定义一个函数f:

(setq f
(let ((x 1))
(lambda (y) (* x y))))

当这样调用f时,返回的不是1×2二是2×2

(let ((x 2))
(funcall f 2))

我猜你可能混淆了LEGB Rule和Dynamic Scoping,他们相同的地方都是由内向外逐层检查变量的定义是否存,但是有闭包的lexical scoping是逐层向外检查Closure中变量是否存在,而dynamic scoping则是根据函数调用链逐层向外检查变量是否存在,哪怕函数的定义不是嵌套的。
python的问题

这是因为python中函数使用Dynamic scoping。f = 42def truth(): print(f)truth()f = 0truth()首先,lambda也是一种函数。Lexical scoping大致上是指,若函数体内引用了外部变量,那么在函数体内该变量的值永远和函数定义前一样,所以上述代码运行后是42,42;Dynamic scoping中该外部变量的值则取决...

lexical relation lexical approach lexicalcategory lexical meaning interlexical lexical feature lexical什么意思 scoping method delexicalize
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机系统怎么更新(手机系统怎么更新到最新版本) 手机操作系统怎么升级最新版本呢 ...一下有没有那种模仿声音的东西,自己给老班打电话时发出的时成年人声... ...经纬线的说法,正确的是( )A.纬线是与地轴垂直并环绕地球的半圆B... 下列有关纬线的说法,正确的是( )A.所有纬线长度都相等B.纬线都是半 ... 下列有关经纬线的说法,错误的是( )A.地球仪上能画无数条经线B.所有纬 ... 关于纬线和纬度的叙述,不正确的是( )A.纬线指示南北方向B.北纬用“N... 纬线的特征中说法错误的是( ) A.所有纬线相互平行 B.纬线等长 C.同一纬... 下列关于纬线的说法,不正确的是( )A.所有纬线都自成圆圈B.纬线长度都... 关于纬线的说法,错误的是( ) A.纬度越高,纬线越短 B.纬线都是圆圈 C... 我姓孟我儿子是维字辈的2010年阳历3月18日出生的,属虎应该叫什么名字好听 用photoshop套索工具时,套索一部份后要想暂停,按哪个键啊? PS的多边形套索工具使用的时候,不可以中途停下来吗? ps里 用完套索工具后 怎么放弃这个工具 而不消除 已经选定好的图像呢 怎么看不见自己QQ邮箱 我QQ怎么找不到 QQ邮箱? . 早bios里如何看出电脑硬盘,内存,显卡的大小 梦见自己被追杀还和自己喜欢的人分开了 梦见和自己心爱的男人经历生死 解梦 我梦见了和我喜欢的人面临生死 有梦见了让鬼吓到了 梦见喜欢的人与自己分离 怎样去掉晦气 怎样解除晦气 什么东西可以去晦气呀? 看守所出来吃什么除晦气 执业药师在在哪里报名 2020年国考笔试内容和19年的笔试内容和会有区别吗? iphone储存空间一会满一会空 大学生空闲时间可以兼职做什么? sftp的get如何限速 如何参加冬奥会闭幕式 如何报名参加中国2022年冬奥会志愿者? 举办冬奥会需要什么条件? 怎样才能参加冬奥会 大学生如何参与到冬奥会中 举办冬奥会需要具备什么条件? 冬奥会志愿者报名条件是什么? 申办冬奥会需要具备的条件是什么? 为什麼各个国家都要申请冬奥会?在哪个国家办不就可以了? 操作技能的培训要求有哪些口诀 北京冬奥会中国选手用不用参加资格赛 培训课堂纪律基本要求 为什么冷冻的东西上贴不上标签 物联网5G芯片模式有哪些? 如果大蒜长芽,还能用来炒菜吗 土豆长芽了吃了会中毒,那大蒜长芽了还能烧菜吗? 发芽的大蒜,土豆到底有没有毒 为什么 Python 不是 lexical scoping? 桂林农村户口的新农合在南宁三甲医院住院可以报销百分之多少? 南宁市三塘镇新农合在南宁医科大报销多少