Python中的词法范围

时间:2017-01-27 11:44:18

标签: python scoping

我正在学习Python,更具体地说,我正在探索范围规则。

我尝试了以下内容"实验":

def increment(n): 
   n += 1 
   print(n)
   return n

n = 1 
increment(n) 
print(n) 

这段代码输出:2,1。由于变量n返回到全局环境,是否应该输出2,2?

您的建议将不胜感激。

2 个答案:

答案 0 :(得分:4)

这里有两个不同的变量(名称):一个位于全局范围内,另一个位于increment的本地。重新绑定increment中的本地地址不会影响全局地址,increment返回它自己的n这一事实也不会影响全球的n(它们具有相同名称的事实是无关紧要的)。如果您希望全局increment()指向n = 1 print(n) n = increment(n) print(n) 返回的值,则必须明确地重新绑定它:

onkeyup

答案 1 :(得分:0)

考虑以下对上述代码段的修改:

def increment(n): 
   n[0] += 1 
   print(n[0])
   return n

n = [1] 
increment(n) 
print(n[0]) 

这会打印2,2。

在许多计算机语言(其中包括Javascript)中, primitive (如整数1和2)或复合(如同一个)的函数参数之间存在差异 - 元素列表n [0])。通常原语通过值传递(它们的值被复制到函数内部的临时变量)。复合实体通常不会被复制,而是通过引用传递(传递实体的地址并从函数内访问实体)。如果我查看上面两个代码片段的输出,在我看来Python也会产生差异。

PS我写完这篇文章后,我看了a 2009 Stack Overflow question。原始实体在最受欢迎的2009答案中称为不可变对象,复合实体称为可变对象,否则我的答案与旧答案一致。< / p>