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