在python函数中使用全局变量

在python函数中使用全局变量,python,Python,下面是在函数中使用x的代码 x = 1 def f(): y = x x = 2 return x + y print x print f() print x 但是python不会在函数范围外查找变量,它会导致UnboundLocalError:在赋值之前引用局部变量“x”。我不想修改全局变量的值,我只想在执行y=x时使用它 另一方面,如果我只是使用它作为回报,它会按预期工作: x = 1 def f(): return x print x print f() 有

下面是在函数中使用
x
的代码

x = 1
def f():
    y = x
    x = 2
    return x + y
print x
print f()
print x
但是python不会在函数范围外查找变量,它会导致
UnboundLocalError:在赋值之前引用局部变量“x”
。我不想修改全局变量的值,我只想在执行
y=x
时使用它

另一方面,如果我只是使用它作为回报,它会按预期工作:

x = 1
def f():
  return x
print x
print f()

有人能解释一下原因吗?

如果要修改值,必须在函数中指定
global x
, 但是,仅读取值并不是强制性的:

x = 1
def f():
    global x
    y = x
    x = 2
    return x + y
print x
print f()
print x
输出

1
3
2

如果要修改值,必须在函数中指定
global x
, 但是,仅读取值并不是强制性的:

x = 1
def f():
    global x
    y = x
    x = 2
    return x + y
print x
print f()
print x
输出

1
3
2

我想我没有修改这个值。问题更新了
y=x
,没有修改
x
,所以为什么我需要一个
global
关键字here@IjazKhan
y=x
不是,而是
x=2
是。但是
x=2
意味着分配一个新的局部变量赋值,在这种情况下,python将首先查看局部范围。由于行
y=x
位于该行上方,因此在这种情况下,python应该查看全局范围,并将值1设置为1y@IjazKhan如果没有
global
,python会看到
y=x
,因此它会基于全局
x
实例化
y
,因为读取全局变量是可以的。但是
x=1
尝试修改全局变量
x
,如果没有
global x
,这是禁止的。其背后的想法是,读取全局变量是无害的,因此python让您在没有预防措施的情况下执行它。但是,修改全局变量可能会产生意外的结果,因此python要求您明确地说“我希望使用全局变量
x
,并能够修改它”。我认为我没有修改该值。问题更新了
y=x
,没有修改
x
,所以为什么我需要一个
global
关键字here@IjazKhan
y=x
不是,而是
x=2
是。但是
x=2
意味着分配一个新的局部变量赋值,在这种情况下,python将首先查看局部范围。由于行
y=x
位于该行上方,因此在这种情况下,python应该查看全局范围,并将值1设置为1y@IjazKhan如果没有
global
,python会看到
y=x
,因此它会基于全局
x
实例化
y
,因为读取全局变量是可以的。但是
x=1
尝试修改全局变量
x
,如果没有
global x
,这是禁止的。其背后的想法是,读取全局变量是无害的,因此python让您在没有预防措施的情况下执行它。但是,修改全局变量可能会产生意外的后果,因此python要求您明确地说“我想使用全局变量
x
并能够修改它”。问题不是
y=x
,而是
y=x
x=2
一起。删除其中一个,此错误将消失。(但是您可能会得到不同:)但是
x=2
y=x
下面,所以我的意思是python应该首先处理
y=x
,将1分配给y,然后在
x=2
行上创建一个新的局部变量并为其分配一个值2。不是吗?问题不在于
y=x
而是
y=x
x=2
在一起。删除其中一个,此错误将消失。(但是您可能会得到不同:)但是
x=2
y=x
下面,所以我的意思是python应该首先处理
y=x
,将1分配给y,然后在
x=2
行上创建一个新的局部变量并为其分配一个值2。不是吗?