找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2019|回复: 5

[求助] 求帮助,搞不懂这个代码

1

主题

4

帖子

4

积分

贫民

积分
4
233a./ 发表于 2022-2-7 12:34:30 | 显示全部楼层 |阅读模式
1威望
var = 99

def local():
    var = 0

def glob1():
    global var
    var += 1

def glob2():
    var = 0
    import quizz
    quizz.var += 1
    #global var
    #var += 1

def glob3():
    var = 0
    glob = sys.modules['quizz']
    glob.var += 1
    #global var
    #var += 1
   
def test():
    print(var)
    local();glob1();glob2();glob3()
    print('Q')
    print(var)



import quizz
quizz.test()
如果代码这么运行为什么最终答案会是
99
Q
102
102
Q
105


如果不运行 import quizz 和 quizz.test()这个代码
而只运行


test()


运行结果又是
99
Q
102
Q
100

实在没搞懂,求求大神帮忙解释一下







回复

使用道具 举报

0

主题

10

帖子

10

积分

贫民

积分
10
roger0wang 发表于 2022-2-8 16:35:44 | 显示全部楼层
感谢你提供的这个代码,让我受益匪浅。这里面涉及到变量命名空间、作用域和import导入的知识。相关链接:
python的命名空间以及作用域
Python import机制详解

根据我的理解,手画了下第一种的运行过程,一起学习。
quizz的var的变化过程.jpg


回复

使用道具 举报

0

主题

8

帖子

8

积分

贫民

积分
8
无名者 发表于 2022-2-11 14:19:06 | 显示全部楼层
quizz是个什么?
你在顶部命名了一个var这是一个全局变量,函数里定义var的是局部变量。局部变量不会影响到全局变量。但如果glob1申明var时则函数内的var就是全局变量了。运行该函数会改变全局变量var。再有如果var是从别的文件中导入的,如果是形如from quizz import var并且放在本文件var定义的后面,那么导入的var就会覆盖本文件内定义的var.
回复

使用道具 举报

0

主题

5

帖子

5

积分

贫民

积分
5
悍匪张三 发表于 2022-2-12 13:41:30 | 显示全部楼层
建议把问题格式整理一下再发出来
回复

使用道具 举报

1

主题

4

帖子

4

积分

贫民

积分
4
233a./  楼主| 发表于 2022-3-8 17:42:10 | 显示全部楼层

首先感谢各位哥哥的留言


#quizz,py    下面代码都储存在quizz里面

var = 99

def local():
    var = 0

def glob1():
    global var
    var += 1

def glob2():
    var = 0
    import quizz
    quizz.var += 1
   
def glob3():
    var = 0
    glob = sys.modules['quizz']
    glob.var += 1
   
def test():
    print(var)
    local()
    print(0)
    glob1()
    print(1)
    glob2()
    print(2)
    glob3()
    print(3)
    print('Q')
    print(var)


假如我执行以下代码:

---import quizz
---quizz.test()


我会得到

99
0
1
2
3
Q
102
102
0
1
2
3
Q
105

加入我运行 test()

我会得到

99
0
1
2
3
Q
102
2
3
Q
100



至于全局变量和局部变量我还是清楚的,我不明白的点是为什么执行 ----import quizz 和 ---quizz.test() 的时候
为什么会得到这个答案,到底是什么样得走向导致这样得

我再加入了数字之后,大概有点明白了,但又不太明白。
回复

使用道具 举报

1

主题

4

帖子

4

积分

贫民

积分
4
233a./  楼主| 发表于 2022-3-8 17:45:20 | 显示全部楼层
roger0wang 发表于 2022-2-8 16:35
感谢你提供的这个代码,让我受益匪浅。这里面涉及到变量命名空间、作用域和import导入的知识。相关链接:
p ...

谢谢哥哥得手抄,我想问为什么这个要走两边啊,走完import 和 quizz.test(), 为社么还要再走一边quizz.test()啊。 麻烦哥哥再给我讲讲,谢谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表