Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 理解超简单函数输出_Python_Python 2.7 - Fatal编程技术网

Python 理解超简单函数输出

Python 理解超简单函数输出,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

我不明白为什么输出是这样的,而不是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?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:没有。使用新的不同名称。