为什么 Python 不是 lexical scoping?
关注者
146被浏览
9,894你以为Python是
实际上Python是
这和lexical scoping一点关系都没有啊
这是个mutable vs immutable的问题
python的scope是这样的
你认为的scope是这样的
因为Python的scope是mutable的,所以x = 3只是把x的binding修改成指向3
就是这样
let foo () =
let x = 1 in
let inner () = x + 1 in
let x = 3 in
print (inner ())
实际上Python是
let foo () =
let x = ref 1 in
let inner () = !x + 1 in
x := 3;
print (inner ())
这和lexical scoping一点关系都没有啊
这是个mutable vs immutable的问题
python的scope是这样的
+--------------------------+
| +---------------+ |
| def foo|(): | |
| +----+ | |
| | x = 1 | |
| | +-------+ | |
| | def inner|(): | | |
| | +------+ | | |
| | | return x + 1 | | |
| | +--------------+ | |
| | x = 3 | |
| | print inner() | |
| +--------------------+ |
+--------------------------+
你认为的scope是这样的
let foo () =
+-------------------------------+
| let x = 1 in |
| +--------------------------+ |
| | let inner () = x + 1 in | |
| | +---------------------+ | |
| | | let x = 3 in | | |
| | | print (inner ()) | | |
| | +---------------------+ | |
| +--------------------------+ |
+-------------------------------+
因为Python的scope是mutable的,所以x = 3只是把x的binding修改成指向3
就是这样