全球主机交流论坛

标题: 请教一个python问题 [打印本页]

作者: pcppc    时间: 2023-5-30 17:42
标题: 请教一个python问题
本帖最后由 pcppc 于 2023-5-30 18:10 编辑

a.py内容为

from b import a,setx
setx("2")
print (a)


b.py内容为
a="1"
def setx(str):
    global a
    a=str



为什么运行a.py 打印出来还是
1

pycharm
求大佬解惑
作者: ftlh2005    时间: 2023-5-30 17:43
根据给出的代码和情况,似乎存在一些变量名混淆的问题,建议检查以下几点:

确认两个.py文件是否在同一目录下

检查变量名是否与函数名冲突或重复,比如a.py中用了setx来设置变量a的值,而b.py文件中也有一个函数叫做setx,容易引起歧义和混淆。

检查函数setx的定义部分是否正确,需要注意:

在函数中使用global声明的是全局变量server_zhuangtai,而非a
函数的形参命名不应该使用关键字str,因为这是内置函数的名称
如果以上问题都没有导致错误,仍然无法解决问题,那么可以尝试在运行a.py时,加上-b参数指定b.py所在的具体路径。例如:python a.py -b /path/to/b.py

作者: pcppc    时间: 2023-5-30 17:46
ftlh2005 发表于 2023-5-30 17:43
根据给出的代码和情况,似乎存在一些变量名混淆的问题,建议检查以下几点:

确认两个.py文件是否在同一目 ...

这个ai是假的
作者: honus    时间: 2023-5-30 17:47
global a
作者: pcppc    时间: 2023-5-30 17:48
honus 发表于 2023-5-30 17:47
global a

在a文件定义吗
作者: linhai    时间: 2023-5-30 17:49
从代码来看,这是因为在`b.py`中定义的变量`a`和`a.py`中通过`from b import a`导入的变量`a`是两个不同的变量。在Python中,模块是一个独立的命名空间,模块中定义的变量在其他模块中无法直接访问。因此,在`a.py`中修改`setx("2")`执行的`b.py`中的`setx()`函数中的变量`a`,对`a.py`中导入的变量`a`没有任何影响,所以输出结果仍然是`1`。

如果想要让`setx()`函数修改`a.py`中导入的`a`变量,需要在`b.py`中将`a`变量声明为全局变量,而不是声明在模块内部,方法如下:

b.py内容:

```python
global a
a="1"
def setx(str):
    global a
    a=str
```

这样,`setx()`函数就可以直接修改`b.py`中声明的全局变量`a`,从而改变`a.py`中导入的`a`变量的值。
作者: 雁过拔毛的MJJ    时间: 2023-5-30 17:56
本帖最后由 雁过拔毛的MJJ 于 2023-5-30 18:04 编辑

变量相同时,全局变量会屏蔽局部变量,好像是这么说的吧,(就是局部变量只在函数内部生效)
b.py函数里的a已经不是全局变量a了,虽然看着是a,但是只在函数内部生效,不会改变外部的a值
你要是想要改变a的值,你就要在b.py声明a是全局变量
作者: pcppc    时间: 2023-5-30 18:10
雁过拔毛的MJJ 发表于 2023-5-30 17:56
变量相同时,全局变量会屏蔽局部变量,好像是这么说的吧,(就是局部变量只在函数内部生效)
b.py函数里的a ...

global a  这句声明了   还是不行
作者: pcppc    时间: 2023-5-30 18:16

作者: 雁过拔毛的MJJ    时间: 2023-5-30 18:22
本帖最后由 雁过拔毛的MJJ 于 2023-5-30 18:34 编辑
pcppc 发表于 2023-5-30 18:10
global a  这句声明了   还是不行


因为你的代码写的有问题啊,from b import a,这里导入的a值是从b.py文件的a值,导入时setx函数并未运行,所以你希望怎么变?他就永远是1啊

这么说吧,标准导入格式应该这样写的,from b import a as c,你导入了a的值并赋给c,可以简写成from b import a,但是你要明白,这个a和b.py里的a没关系了,你在a.py已经重新定义一个变量a,
作者: pcppc    时间: 2023-5-30 19:56
感谢大佬 意思是模块1导入模块2的a的时候 其实是 重新定义了一个a  不过值是=模块2的值而已  
作者: pcppc    时间: 2023-5-30 19:57
雁过拔毛的MJJ 发表于 2023-5-30 18:22
因为你的代码写的有问题啊,from b import a,这里导入的a值是从b.py文件的a值,导入时setx函数并未运行 ...

感谢大佬 意思是模块1导入模块2的a的时候 其实是 重新定义了一个a  不过值是=模块2的值而已
这样理解对吗




欢迎光临 全球主机交流论坛 (https://52.ht/) Powered by Discuz! X3.4