x = 300
def myfunc():
x = 200
print(x)
myfunc()
print(x)
有点难以理解,为什么 python 对于变量的 scope 为什么是这样,在函数里 assign 竟然操作的不是同一个对象? 感觉跟其他编程语言都不一样啊
1
fzzff 2020-04-03 17:30:14 +08:00
作用域嘛,也不难理解吧
|
2
HashV2 2020-04-03 17:31:28 +08:00 2
这有什么难理解的吗? 你之前写前端的吗?
|
3
raymanr 2020-04-03 17:32:51 +08:00
函数内不能修改外部变量, 需要修改的话函数内使用 global 关键字
|
4
skymei 2020-04-03 17:33:26 +08:00
emmm.. 有啥难理解的 作用域
|
6
Vegetable 2020-04-03 17:35:43 +08:00 1
你说的其他语言,应该是有声明变量的关键词的,比如 var const let 等等, 声明和赋值姑且算两步吧.
python 里只有一个等号,要完成两件事情. 大部分时候解释器都知道你是想赋值还是想声明, 没有变量就先声明变量再赋值, 有变量就直接赋值. 但是你的例子里,出现两个作用域, 这时候函数内部作用域可以使用外部的 x, 也可以重新声明一个 x,出现了歧义. 解释器无法判断(假如没有后边的关键字)你到底是想赋值还是想声明变量再赋值. 因此 python 用于两个关键字来解决这个问题:global 和 nonlocal https://docs.python.org/zh-cn/3/reference/simple_stmts.html#the-global-statement |
7
superrichman 2020-04-03 17:53:15 +08:00 1
其实其他语言都是这样的,真正奇怪的那个是 js 。。。
|
8
v2byy OP @Vegetable 谢谢回复。如果是静态语言,在 main 以外的 declaration 就算是 global 变量了,这样不管在函数里 definition,也就是在函数里赋值的话,会影响这个 global 变量。我开始以为 python 在函数里直接给一个已经声明的变量赋值,是可以改变这个"global"变量的。
|
9
black11black 2020-04-03 18:06:52 +08:00
@v2byy 看来 es6 不应该修正作用域问题,应该照你所说的“静态语言”来设计 ┓( ´∀` )┏
|
10
smallpython 2020-04-03 18:17:26 +08:00
如果不是这样设计的话, 就很有可能你在你自己写的函数里修改了其他函数里变量的值, 岂不是很危险嘛
|
11
fkdtz 2020-04-03 18:20:59 +08:00
python 的话,看看 LEGB 还有 COW 机制
|
12
liprais 2020-04-03 23:56:58 +08:00
楼主你猜猜这段代码里面打印出来啥
a = [1,2,3] i = 0 for i in a:print(i) print(i) |
14
Gakho 2020-04-04 08:11:26 +08:00
函数内修改外部变量,不是怪胎 JS 的设计吗?
|
15
zhanlingjie 2020-04-08 14:04:56 +08:00
def func():
global a a = 6 再试试看 |