known = {0:0,1:1} a = [1,2,3] def example(): known[2] =1 a[2]=3 print(known,a) example() #但是如果是下面 been_called = Ture def example2(): print(been_called) been_called = True print(been_called) 语法错误,必须: def example2(): global been_called print(been_called) been_called = True print(been_called)
![]() | 1 rogerchen 2017-02-02 21:50:57 +08:00 anti-pattern 不要在函数 scope 里边乱动全局变量 |
2 wangning3100 2017-02-02 21:57:10 +08:00 第一个 example2 函数的第 2 行"been_called = True"把变量"been_called"定义成了该函数的局部变量,所以执行"print(been_called)"的时候"been_called"还没初始化,报 UnboundLocalError |
![]() | 3 redhatping OP @wangning3100 这个我知道, 为什么列表,字典不受影响。 |
4 wangning3100 2017-02-02 22:03:37 +08:00 @redhatping 因为你并没有在 example 函数里重新声明(初始化) a 和 know ,只是引用了而已 |
![]() | 5 wodesuck 2017-02-02 22:06:50 +08:00 @redhatping 与列表字典无关,你试一下在 example()最后加一个 known={}就明白了 |
![]() | 6 redhatping OP |
7 wangning3100 2017-02-02 22:15:15 +08:00 @redhatping count += 1 === count = count + 1 ,重新声明了 |
![]() | 8 kindjeff 2017-02-02 22:20:40 +08:00 via iPhone 去看看 python 里的可变对象和不可变对象。 |
![]() | 9 redhatping OP @kindjeff 谢谢 |
10 rocksolid 2017-02-02 22:32:48 +08:00 ![]() |
![]() | 11 yeyuexia 2017-02-02 22:33:35 +08:00 @redhatping 你字典只是引用 不是用 = 赋值 所以地址不变 |
12 zzyzxd 2017-02-03 03:11:44 +08:00 如果你要在函数中改动全局变量,就必须有 global 声明。若光是读全局变量则不需要。 你的第一个 example 里,读了全局变量 a ,但并没有改动 a (还是指向同一个 list )。具体来说,你干的事情是:读到了 list a ,取了第三个元素并把它 refer 到 3 。 dict 同理。 |
![]() | 13 20015jjw 2017-02-03 04:27:01 +08:00 python 会 precheck 你的 scope 看你定一了 been_called 就认为是本地 variable 了 |
![]() | 14 Kilerd 2017-02-03 09:23:26 +08:00 via iPhone 引用和非引用的区别 |
![]() | 15 robinlovemaggie 2017-02-03 10:20:38 +08:00 "UnboundLocalError: local variable 'been_called' referenced before assignment", 摘取 stackoverflow 的解释 Basically the rule is: If you try to assign a global variable from within a function, you need to use the global keyword within that function. Otherwise you don't need the global keyword at all. Whether or not the variable is a boolean makes no difference. |
![]() | 16 XYxe 2017-02-04 08:37:28 +08:00 最内嵌套作用域规则:由一个赋值语句引进的名字在这个赋值语句所在的作用域里是可见(起作用)的,而且在其内部嵌套的每个作用域里也可见,除非它被嵌套与内部的,引进同样名字的另一条赋值语句所遮蔽。 |
![]() | 17 billytv 2017-02-04 11:30:39 +08:00 楼主的 True 拼写错为 Ture, 没人发现吗? |