关于Python中的变量作用域

来源:互联网 发布:邪恶少女漫画软件 编辑:程序博客网 时间:2024/06/10 15:51
 【财主】司令(510337315)  21:02:13
python 中:
w = w+1
是从左往右算的吗?

瓜皮加入本群
【管家】Mike(865970132)  21:04:43
w += 1
【财主】司令(510337315)  21:05:12
什么意思 ?

兵者诡道加入本群

qsy加入本群
【佃户】Rm(392093658)  21:24:53
paramiko  用普通用户登录系统后 如何再使用su -root 自动交互登录
【财主】司令(510337315)  21:33:59
def  inc_w_v1(0:
【财主】司令(510337315)  21:36:04
>>>def  inc_w_v1():
                w=w+1
                print("w = ", w)
>>>w
37
>>>inc_w_v1() 
【财主】司令(510337315)  21:37:13

涉及到变量作用域的问题 , 请问有什么问题 ?
【财主】PlayBoy(1182096147)  21:41:03

【财主】司令(510337315)  21:41:32
>>> w = 37
>>> def inc_w_v1():
...     w = w+1
...     print "w=", w
... 
>>> w
37
>>> inc_w_v1()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in inc_w_v1
UnboundLocalError: local variable 'w' referenced before assignment
【短工】兵者诡道(703171779)  21:45:04
想引入外部的全局变量,先用global w语句引入再说呗
【财主】PlayBoy(1182096147)  21:46:43
+1
【财主】司令(510337315)  21:47:07
>>> w
37
>>> def foo():
...     print w
... 
>>> foo()
37
>>> 
w 是全局变量,在foo()函数里面不是能用了吗 ?
也没有global嘛
【短工】兵者诡道(703171779)  21:49:10
w = w+1 你这个语句相当于声明了个局部变量,当然要用global引入全局变量啊
【财主】司令(510337315)  21:50:05
什么样的语句,相当于声明一个变量 ?
【佃户】小凡(1163339655)  21:50:47
其实py不需要声明,我感觉
【财主】清水<15818642877>  21:50:52
什么都是对象啊
【短工】chen(394383094)  21:51:17
赋值语句
【短工】兵者诡道(703171779)  21:51:42
你如果写个w = 1,那就是在里面重新定义了个局部变量,而不是改写外面的变量
【财主】司令(510337315)  21:53:46
w =1 也是定义了一个对象,然后w指向它,
而w=w+1 呢 ?
【财主】司令(510337315)  21:54:54
@兵者诡道 
w = w+1 怎么相当于声明变量的 ?
两个w呢?
【短工】兵者诡道(703171779)  21:56:29
python里的加法是新生成一个对象,然后把引用 指向它,你这里两个w当然会有问题,第一个w对象都没有指定对象,就要+1生成另一个对象,这可能嘛
【佃户】小凡(1163339655)  21:57:18
我也这么理解的
【管家】Issac(397423986)  21:58:26
等下
【财主】司令(510337315)  21:58:33
等下
我理解一下
【管家】Issac(397423986)  21:58:38
我认真看看
【财主】司令(510337315)  21:58:45
我也是
【财主】司令(510337315)  22:00:12
@兵者诡道 
【管家】Issac(397423986)  22:00:32
兵者诡道说的肯定不对
【财主】司令(510337315)  22:00:38
能不能重说一下,那第二个w呢 ?
LGB 原则不管用了吗?
【管家】Issac(397423986)  22:01:21
我擦
你只定义了函数,没运行啊
那加个毛线啊
【财主】司令(510337315)  22:02:22
>>>def  inc_w_v1():
                w=w+1
                print("w = ", w)
>>>w
37
>>>inc_w_v1() 
【财主】司令(510337315)  21:37:13

涉及到变量作用域的问题 , 请问有什么问题 ?
【财主】PlayBoy(1182096147)  21:41:03

【财主】司令(510337315)  21:41:32
>>> w = 37
>>> def inc_w_v1():
...     w = w+1
...     print "w=", w
... 
>>> w
37
>>> inc_w_v1()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in inc_w_v1
UnboundLocalError: local variable 'w' referenced before assignment
【管家】Issac(397423986)  22:02:41
哦,这里啊
【财主】司令(510337315)  22:02:57
>>> w = 37
>>> def inc_w_v1():
...     w = w+1
...     print "w=", w
... 
>>> w
37
>>> inc_w_v1()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in inc_w_v1
UnboundLocalError: local variable 'w' referenced before assignment
@兵者诡道 
求说下,我看你最清楚了
【短工】兵者诡道(703171779)  22:03:32
我感觉python里面一条语句里面不能出现变量的二义性的
你的想法肯定是这样的
w(局部变量) = w(全局变量) + 1
然后w(局部变量) = 38
【财主】司令(510337315)  22:04:28
是的,我看youtube 上面说python遇到这里的两个w就会confusion, 但是我没听懂
【短工】兵者诡道(703171779)  22:04:50
但是实际上应该是这样的w(局部变量) = w(局部变量) + 1
【长工】鑫鑫礼物网(416708261)  22:05:15
加 global
就38了
【短工】兵者诡道(703171779)  22:06:35
如果你用另一个变量名,那就是没有问题的
同样的变量名,肯定把全局变量给屏蔽掉了
【财主】司令(510337315)  22:07:32
现在是错误啊
k = w+1
这样会不会有问题,我试试
【短工】兵者诡道(703171779)  22:08:00
不会有问题啊
【财主】司令(510337315)  22:08:24
稍等
【管家】ゞ Empty°(6015687)  22:09:23

【财主】司令(510337315)  22:09:27
恩,不会有问题
【管家】Issac(397423986)  22:09:57

厉害
【财主】司令(510337315)  22:10:10
那 w = 10会不会有问题 ?   @兵者诡道 
不会
【短工】兵者诡道(703171779)  22:11:05
这个就是个纯局部变量了
【财主】司令(510337315)  22:11:17
那这样说,这两个w是不一样的 
【长工】鑫鑫礼物网(416708261)  22:12:06
你最好看下函数
里面有讲到作用域
【财主】司令(510337315)  22:12:39
第二个w指向的是全局变量,把这个全局变量+1后生成一个新的对象 28 ,然后把这个对象28 再给第一个w, 第一个w是局部变量
【短工】兵者诡道(703171779)  22:12:37
不是不一样,是你直接一上来就写个 w = w + 1,换成任何一个变量名都不行
【财主】PlayBoy(1182096147)  22:13:12
他还没理解。。。
【短工】兵者诡道(703171779)  22:13:33
异常已经说得很清楚了,local variable 'w' referenced before assignment
【财主】司令(510337315)  22:13:58
翻一下子 ?
【短工】兵者诡道(703171779)  22:14:16
指定变量之前就引用了变量
【财主】司令(510337315)  22:15:34
奥,是这个样子,
【财主】司令(510337315)  22:16:47
是说w还没绑定到对象,就被使用了,是吧
【短工】兵者诡道(703171779)  22:17:06

【财主】司令(510337315)  22:17:49
那这里有歧义的,我想着这两个w是不一样的
第一个w是局部,第二个w是全局
【短工】兵者诡道(703171779)  22:19:00
如果是这样,那就不会报错的
现在肯定是两个w都是局部变量了
【财主】PlayBoy(1182096147)  22:19:20
没有特殊的标识,你怎么能让解释器把两个长的一模一样的东西看成不一样的

别纠结了,还是尽量避免这样写就是了!
【短工】兵者诡道(703171779)  22:20:59
这才是正解
【财主】司令(510337315)  22:21:45
所以想知道w=w+1的运行顺序的,python 遇到了,肯定先看第二个w,哎,发现local里面没有,根据LGB原则,全局变量里面有,就找到了,那么就把全局变量里面的对象+1生成一个新的对象,然后绑定到第一个w
【财主】PlayBoy(1182096147)  22:22:09
。。。
【财主】司令(510337315)  22:22:59
就是想把问题搞清楚,搞清楚了,以后才好写城固县
程序
【长工】泪痕_元怜(958186957)  22:24:49
 linux 下 用什么命令 可以查看 当前ftp 用户
或者 ftp日志

祈福~加入本群
【财主】司令(510337315)  22:33:06
再问一下,什么样的语句会产生‘变量名’和‘对象’ 两个玩意 ?
比如讲print w 不会, w = 2会产生一个变量名w和一个对象2
【财主】司令(510337315)  22:38:51
@PlayBoy 
@兵者诡道 

 【财主】司令(510337315)  22:33:06
再问一下,什么样的语句会产生‘变量名’和‘对象’ 两个玩意 ?
比如讲print w 不会, w = 2会产生一个变量名w和一个对象2
【财主】司令(510337315)  22:38:51
@PlayBoy 
@兵者诡道 

zhou加入本群
【短工】zhou(517908183)  22:39:52
hello world
【佃户】新一(1013279512)  22:45:17
想问下这套书怎么样
【管家】上海-harry(632118553)  22:45:56
讲得很细,可以呢
【佃户】新一(1013279512)  22:46:09
嗯  
准备入手一套来学习下
【管家】上海-harry(632118553)  22:46:32
刚才那个问题,这本书就说得很明白
Assigned names are local unless declared global or nonlocal. By default, all
the names assigned inside a function definition are put in the local scope (the
namespace associated with the function call). If you need to assign a name that
lives at the top level of the module enclosing the function, you can do so by declaring
it in a global statement inside the function. If you need to assign a name
that lives in an enclosing def, as of Python 3.X you can do so by declaring it in a
nonlocal statement. 



再参考一下这个链接:

http://blog.csdn.net/magictong/article/details/4464024
0 0