我正在学习Python,更具体地说,我正在探索范围规则。
我尝试了以下内容"实验":
def increment(n):
n += 1
print(n)
return n
n = 1
increment(n)
print(n)
这段代码输出:2,1。由于变量n返回到全局环境,是否应该输出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>