你如果没有重新赋值,就不可能打印的值不一样,是后面 b 重新赋值了 重点在你函数内的global,把b里面重新定义成全局变量。
1、调用f3(3),a =3 ,print(b),里面的值就是外面的值,下面重新赋值因为在print之后,所以只是打印了b =6.
再次调用b的时候,因为函数里有个b=9, 所以输出了9。
2、同理,a没变化,b因为你重新赋值了9,所以打印的是9.
3、b = 30,输出30.
你第二个print的前面写了一个b = 30,给b重新赋值了啊,自然不一样 172226325 发表于 2020-6-2 14:40
感谢~
{:10_297:}帮助到你的话就设置最佳吧 ~ 本帖最后由 heidern0612 于 2020-6-2 14:59 编辑
172226325 发表于 2020-6-2 14:47
我还是有两个问题(水平比较菜哈):
1. 前后两次调用 f(3), 都输出了b,为什么第二次变成了9呢?它也经历 ...
1、这是个简单的问题,跟函数没啥关系。
看下面这个例子就明白了,x= 10 ,我printl之后,修改x = 20,那该打印x =20吗? 显然不是,因为你print在前,赋值在后面。同样看你的问题, 你赋值为9,那不是print之后赋值的吗?你print之后赋值了,b为9你也没打印啊,为啥要输出9呢?
你终端屏幕上打了个b,显示9那是因为你在终端操作的,不是在IDE里操作的,在IDE里面,因为你没print b,所以b print的结果还是6,但是值已经随着你后面改成9而变成了9.
x = 10
for i in range(0,3):
print(x)
x += 10
2、你只要在函数内global,那就在内复制操作和在外赋值操作是一样的。
172226325 发表于 2020-6-2 14:47
我还是有两个问题(水平比较菜哈):
1. 前后两次调用 f(3), 都输出了b,为什么第二次变成了9呢?它也经历 ...
[*] 你可能没理解 global ,只要在函数内部 用 global 声明之后,在函数内部就可以对值进行修改了,也就是函数在你第一次调用时候 b 被赋值为了 9
[*] global 没声明之前,在函数内部不能直接对函数外部的参数,也就是全局变量在函数内部不能修改,而声明之后 函数内部就可以直接修改
1) 可以当成例子
2) 你在全局命名空间直接赋值肯定可以看作是修改全局变量全局命名空间就是函数外部,我觉得你想表达的应该是这个意思才对x = 88
def func():
global x
x = 99这样就是函数内部通过声明 global 后修改了全局变量
172226325 发表于 2020-6-2 15:25
我可以理解为:没有声明global b的话,我不能调用外面的 b = 6 , 声明之后就可以调用了吗?这种调用是一 ...
不是调用 是不能修改 172226325 发表于 2020-6-2 15:25
我可以理解为:没有声明global b的话,我不能调用外面的 b = 6 , 声明之后就可以调用了吗?这种调用是一 ...
函数内部没声明global的话,是没办法在函数内部直接用赋值的方式修改外部全局变量的值的。
声明的话,两者指向的内存地址一样了,自然就可以修改了。
global有效期到你此次程序结束运行。 172226325 发表于 2020-6-2 15:38
我觉得自己是对这段截图程序的进行顺序不明白,先执行了什么,然后执行了什么。
首先,调用f3()函数, ...
你有点钻牛角尖了。。。第一次打印6,是因为你赋值6,所以下面打印了6.然后你又紧接着赋值了9,第二次调用f函数的时候,所以打印了9.
你函数赋值没调用的时候,只会检查语法错误,不会管你函数运行。
函数只有在调用的时候,才会运行里面代码段。
我说的程序有效,指的是你程序整个关闭了不运行了,内存空间自然销毁了这个py模块。 172226325 发表于 2020-6-2 15:41
那也就是说,我第二次调用的f(3)的时候,b之所以会是9, 就是因为global已经结束运行了吗
也就是说,只要你函数定义的时候符合语法,瞎打都可以,只要你不调用。
如下这段代码内容,我瞎打的,但是不妨碍程序运行,因为没调用。
def func():
ahjlsdaljksdfkldsfj
adklsjfldksjfldksajf
asldfjkadlskfjdslkfj
print (alksdjaslkdjas) 本帖最后由 heidern0612 于 2020-6-2 16:02 编辑
172226325 发表于 2020-6-2 15:41
那也就是说,我第二次调用的f(3)的时候,b之所以会是9, 就是因为global已经结束运行了吗
或者说这种:
def func(x):
print(x)
x = 10
func(x)
x我后定义的,但是函数在前,我先打印x ,然后再给x赋值可以吗?答案是可以的。
这就涉及到一部分空间作用域的问题,后面学装饰器会用到。
函数运行就是这样,x我没有赋值,函数内部我也没有作用域,但是他会首先找自己空间然后再去外部找,然后再去built-in找。
函数查找参数从来就不是从上到下查找的,而是跟作用域有关。
多练习多思考,自然就明白了。
页:
[1]
2