2017-12-18 99 views
0

我已经遇到了一个关于Python中命名空间和作用域的脚本,对于这个脚本我无法弄清楚这个脚本是如何运行的,因为它混合使用了这两个概念。下面是代码:Python中的命名空间和作用域

j, k = 1,2 
def proc1(): 
     j, k = 3, 4 
     print “ j == %d and k == %d” % (j, k) 
     k = 5 

def proc2(): 
     j = 6 
     proc1() 
     print “ j == %d and k == %d” %(j , k) 

k = 7 
proc1() 
print “ j == %d and k == %d” % (j, k) 

j = 8 
proc2() 
print “ j == %d and k == %d” % (j, k) 

我想这个脚本的输出应该只包含四个打印表现,但事实证明,运行时,它是五位。此外,每行中j和k的值也与我所预期的大不相同。有人能解释这是如何运行的吗?

如果您还可以详细说明这些代码块中的命名空间和作用域,可以提供真诚的感谢。另外,这里是我从我的电脑上运行它的输出,它目前配备了Python 2.7.14。 output result] 1

+0

它打印五个输出,因为在'proc2',有一条线的定义“PROC1()” 对于变量的'Ĵ, k'在你的函数中是局部的,就好像你称它们为j_1,k_1和j_2,k_2并且它们的活性被绑定到函数范围 – BadMiscuit

+0

@BadMiscuit非常感谢!那样的话,什么是值j和k在第二个函数之后 - proc2?对不起,这个迟到的回复 – user8542107

+0

如果你正在讨论第一个j和k(可以说j_0和k_0),它应该是j = 8和k = 7(就像在你的输出中一样)因为你的函数不会修改这些值(它们会创建临时变量) – BadMiscuit

回答

0

小外形解释的变量是如何生活

Scope and liveness

编辑:部分“我们可以重用j_1因为以前j_1这一个永远生活在一起”实际上是不完全准确,因为在proc2你叫proc1,所以他们一起生活。所以蓝j_1(在proc2Ĵ实际上是j_2,我改变了外形。

+1

哇,你的解释太棒了!这个流程图完全是e点亮我!我无法对您的详细和专业的帮助表示感谢。再次感谢! – user8542107

+0

虽然我仍然有一个问题。为什么在执行此功能后pro1中k不会被修改?又如,为什么proc1中的“k = 5”没有用处? – user8542107

+0

@ user8542107由于'proc1()'中的'k = 5'类似于'k_1 = 5',因此您正在为您在最内层范围中定义的变量分配一个新值 – BadMiscuit