myGlobal = "hello"
def changeGlobal():
myGlobal="bye"
Run Code Online (Sandbox Code Playgroud)
from first import *
changeGlobal()
print myGlobal
Run Code Online (Sandbox Code Playgroud)
我得到的输出是
你好
虽然我认为应该是
再见
为什么myGlobal在调用changeGlobal()函数后全局变量不会改变?
Try*_*yPy 19
尝试:
def changeGlobal():
global myGlobal
myGlobal = "bye"
Run Code Online (Sandbox Code Playgroud)
实际上,这也不起作用.当你import *,你创建一个新的本地模块全局myGlobal,它不受你想要的改变的影响(只要你不改变变量,见下文).您可以使用此代替:
import nice
nice.changeGlobal()
print nice.myGlobal
Run Code Online (Sandbox Code Playgroud)
要么:
myGlobal = "hello"
def changeGlobal():
global myGlobal
myGlobal="bye"
changeGlobal()
Run Code Online (Sandbox Code Playgroud)
但是,如果您的global是一个可变容器,那么您现在正在持有对mutable的引用,并且能够看到对它进行的更改:
myGlobal = ["hello"]
def changeGlobal():
myGlobal[0] = "bye"
Run Code Online (Sandbox Code Playgroud)
我曾经和你一样关注过,从诺曼马特洛夫的快速无痛Python教程中读到以下部分真是一个很好的帮助.以下是您需要了解的内容(从Matloff的书中复制):
从C/C++的意义上说,Python并不真正允许全局变量.导入的Python模块不能直接访问导入它的模块中的全局变量,反之亦然.
例如,考虑这两个文件,x.py,
# x.py
import y
def f():
global x
x = 6
def main():
global x
x = 3
f()
y.g()
if __name__ == ’__main__’:
main()
Run Code Online (Sandbox Code Playgroud)
和y.py:
# y.py
def g():
global x
x += 1
Run Code Online (Sandbox Code Playgroud)
x.py中的变量x在整个模块x.py中可见,但在y.py中不可见.实际上,执行行x + = 1
在后者中将导致出现错误消息,"未定义全局名称'x'."
实际上,模块中的全局变量仅仅是该模块的属性(即成员实体),类似于类变量在类中的角色.当模块B由模块A导入时,B的命名空间被复制到A的.如果模块B具有全局变量X,则模块A将创建该名称的变量,其初始值是模块B在导入时对其名称的变量所具有的任何值.但是其中一个模块中对X的更改不会反映在另一个模块中.
假设X确实在B中发生变化,但我们希望A中的代码能够在B中获得X的最新值.我们可以通过在B中包含一个名为GetX()的函数来实现.假设A从B导入了所有东西,那么A将获得一个函数GetX(),它是该函数的B函数的副本,其唯一目的是返回X的值.除非B改变该函数(这是可能,例如可以分配函数),两个模块中的函数将始终相同,因此A可以使用其函数来获取B中的X值.