Python 理解超简单函数输出
我不明白为什么输出是这样的,而不是1,3,1Python 理解超简单函数输出,python,python-2.7,Python,Python 2.7,我不明白为什么输出是这样的,而不是1,3,1 x = 1 def f(): global x y = x x = 2 return x + y print x print f() print x ##output: ## ##1 ##3 ##2 我知道函数的“内部”global x告诉函数看函数外部的x(x=1)。然后我们把x=1放入y中;因此,y=1。现在,localx是2,因此x+y=2+1=3 那么,为什么最后一次打印x会产生2?compai
x = 1
def f():
global x
y = x
x = 2
return x + y
print x
print f()
print x
##output:
##
##1
##3
##2
我知道函数的“内部”global x
告诉函数看函数外部的x(x=1)。然后我们把x=1放入y中;因此,y=1。现在,localx
是2,因此x+y=2+1=3
那么,为什么最后一次打印x会产生2?compailer“选择”返回本地/全局x的原因和方式?这两个命令都在函数状态之外
谢谢 没有本地x
;global
语句在全局函数中使用所有变量
因此,x=2
改变全局x
Python编译器需要预先知道函数中的名称是本地名称还是全局名称。默认情况下,将名称视为全局名称,除非绑定到名称(赋值是名称绑定的一种形式),此时函数中所有变量的使用都变为局部变量。您可以使用global
语句覆盖此行为,然后将名称的所有使用都固定为全局,即使名称已绑定
请参阅Python参考文档中的:
如果名称绑定在块中,则它是该块的局部变量
及
global
语句是保存整个当前代码块的声明。这意味着列出的标识符将被解释为全局标识符
不能在单个作用域中将名称同时视为全局名称和局部名称。请改用不同的名称,就像您使用y
一样,没有本地x
;global
语句在全局函数中使用所有变量
因此,x=2
改变全局x
Python编译器需要预先知道函数中的名称是本地名称还是全局名称。默认情况下,将名称视为全局名称,除非绑定到名称(赋值是名称绑定的一种形式),此时函数中所有变量的使用都变为局部变量。您可以使用global
语句覆盖此行为,然后将名称的所有使用都固定为全局,即使名称已绑定
请参阅Python参考文档中的:
如果名称绑定在块中,则它是该块的局部变量
及
global
语句是保存整个当前代码块的声明。这意味着列出的标识符将被解释为全局标识符
不能在单个作用域中将名称同时视为全局名称和局部名称。改为使用不同的名称,就像您使用
y
global
关键字对整个块(函数体)有效一样,因此基本上没有局部x
。
global
关键字对整个块(函数体)有效,因此基本上没有本地x
。
上次打印的结果是2,因为您更改了函数中的全局变量x。timgeb:我删除了行“print f()”,现在两个“print x”都给出了输出“1”。我猜print f()是一种函数调用?我不明白。谢谢最后一次打印的结果是2,因为您更改了函数中的全局变量x。timgeb:我删除了行“print f()”,现在两个“print x”都给出了输出“1”。我猜print f()是一种函数调用?我不明白。谢谢我很好奇,有没有办法在函数中再次取消全局x?@timgeb:没有。使用一个新的不同名称。我很好奇,有没有办法在函数中再次取消全局x的命名?@timgeb:没有。使用新的不同名称。