Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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_Variables_Methods_Module_Global - Fatal编程技术网

Python全局范围问题

Python全局范围问题,python,variables,methods,module,global,Python,Variables,Methods,Module,Global,在Python中修改不同文件之间的全局变量时遇到问题。例如: File1.py: x = 5 File2.py: from File1 import * def updateX(): global x x += 1 main.py: from File2 import * updateX() print x #prints 5 这里有几件重要的事情需要注意 首先,global不是全局的。真正全局的东西,如内置函数,存储在Python 3中的\uuuuuuuuuuuuu

在Python中修改不同文件之间的全局变量时遇到问题。例如:

File1.py:

x = 5
File2.py:

from File1 import *

def updateX():
    global x
    x += 1
main.py:

from File2 import * 

updateX()
print x #prints 5

这里有几件重要的事情需要注意

首先,
global
不是全局的。真正全局的东西,如内置函数,存储在Python 3中的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
模块或
内置
中<代码>全局表示模块级别

其次,当您导入*时,您会得到与您导入*的模块中的变量同名的新变量,这些变量引用了相同的对象。这意味着,如果在一个模块中重新分配变量,另一个模块将看不到更改。另一方面,变异可变对象是两个模块都看到的变化

这意味着在
main.py的第一行之后:

from File2 import *
File1
File2
\uuuuuu main\uuuuuuu
(主脚本运行的模块)都有单独的
x
变量,引用相同的
5
对象
File2
\uuuuu main\uuuu
也有
updateX
变量引用
updateX
函数

第二行之后:

updateX()
只有
File2
x
变量被重新分配给
6
。(该函数有一个定义位置的记录,因此它会更新
File2
x
,而不是
\uuuuuuu主。)

第三行:

print x

打印
\uuuu main\uuuu
x
,它仍然是5。

@user2357112:注意到了,读错了,但有点含糊不清。好的。那么,您有什么建议作为替代解决方案(不需要从函数返回值)?我不认为Python有指针或类似的东西,所以…@CoffeeMaker:没有更现实的例子很难说。通常,应避免导入*
和全局状态。如果
File2.py
main.py
都引用了
File1.x
,那么问题就不会发生。或者,如果他们通过函数参数而不是全局变量传递
x
数据,也可以避免这个问题。