为什么 Python 不是 lexical scoping?

这似乎背离了现代程序设计语言的一般设计思路。 比如 def foo(): x = 1 def inner(): return x + 1 x = 3 print inner() 会打印出 4 而不是 2。 ---------------------------- edit -------------------------- def foo(): def inner(): return x + 1 x = 3 print inner() 仍然会打印出来 4。
关注者
146
被浏览
9,894
你以为Python是

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


就是这样