为什么这个Python程序会打印出True。

7
x=True
def stupid():
    x=False
stupid()
print x

好的,接下来怎样才能引用外部的x变量? - Brian Harris
哇,有人在我问之前已经回答了 :) - Brian Harris
现在用x = [1]替换x=True,并用x[0] = 2替换x=False,然后再次运行你的代码。 - John Fouhy
8个回答

18

在Python中,您不需要声明函数局部变量。 "x = False" 是指 stupid() 内的本地 x。如果您真的想在 stupid() 中修改全局 x:

def stupid():
    global x
    x=False

8
请注意,如果你在函数内部执行 print x,它将使用全局变量 x。只有 赋值 操作才会创建新的局部变量,但这不会改变原来的意思。 - quark

10

回答下一个问题,使用global关键字:

x=True
def stupid():
    global x
    x=False
stupid()
print x

6
因为x的作用域只在函数stupid()内部。一旦调用该函数并结束,你就超出了它的作用域,并打印在函数stupid()外定义的“x”的值--而在函数stupid()内部定义的x不再存在于堆栈中(一旦该函数结束)。
编辑后:
当您打印时,引用了外部x,就像您所做的那样。
只有在函数stupid()内部时,才能引用内部x。因此,您可以在该函数内打印以查看其包含的x的值。
关于“global”:
它可以工作并回答问题。
经常使用它不是一个好主意。
会导致可读性和可伸缩性问题(还可能更多)。
根据您的项目,您可能需要重新考虑在本地函数内定义全局变量的使用。

5

如果这段代码全部在一个函数中,global 就不会起作用,因为此时 x 不是全局变量。在 Python 3.x 中,他们引入了 nonlocal 关键字,无论代码是在顶层还是在函数内部,都可以使代码正常工作:

x=True
def stupid():
    nonlocal x
    x=False
stupid()
print x

3

如果你想从Python的一个方法中访问全局变量x,你需要明确地这样做:

x=True
def stupid():
    global x
    x=False

stupid()
print x

2
在函数stupid()中,x是一个局部变量,因此你真正拥有两个名为x的变量。

2
在函数中在x=False之前添加"global x",它将打印True。否则,就会有两个"x",分别在不同的作用域中。

2
  • 因为你在 stupid() 内部给 x 赋值,Python 就会在 stupid() 内部创建一个新的 x
  • 如果你只是想在 stupid() 内部读取 x 的值,Python 实际上会使用全局的 x ,这正是你想要的。
  • 要强制 Python 使用全局的 x ,请在 stupid() 的第一行添加 global x

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接