Python 小问题

2020-04-03 17:25:18 +08:00
 v2byy
x = 300

def myfunc():
  x = 200
  print(x)

myfunc()

print(x)

有点难以理解,为什么 python 对于变量的 scope 为什么是这样,在函数里 assign 竟然操作的不是同一个对象? 感觉跟其他编程语言都不一样啊

2506 次点击
所在节点    Python
15 条回复
fzzff
2020-04-03 17:30:14 +08:00
作用域嘛,也不难理解吧
HashV2
2020-04-03 17:31:28 +08:00
这有什么难理解的吗? 你之前写前端的吗?
raymanr
2020-04-03 17:32:51 +08:00
函数内不能修改外部变量, 需要修改的话函数内使用 global 关键字
skymei
2020-04-03 17:33:26 +08:00
emmm.. 有啥难理解的 作用域
v2byy
2020-04-03 17:33:53 +08:00
@HashV2 好吧,我想说的是:在静态语言中,在函数中相当于定义了一个新的变量的话,是很好理解。
Vegetable
2020-04-03 17:35:43 +08:00
你说的其他语言,应该是有声明变量的关键词的,比如 var const let 等等, 声明和赋值姑且算两步吧.
python 里只有一个等号,要完成两件事情. 大部分时候解释器都知道你是想赋值还是想声明, 没有变量就先声明变量再赋值, 有变量就直接赋值.
但是你的例子里,出现两个作用域, 这时候函数内部作用域可以使用外部的 x, 也可以重新声明一个 x,出现了歧义. 解释器无法判断(假如没有后边的关键字)你到底是想赋值还是想声明变量再赋值.
因此 python 用于两个关键字来解决这个问题:global 和 nonlocal

https://docs.python.org/zh-cn/3/reference/simple_stmts.html#the-global-statement
superrichman
2020-04-03 17:53:15 +08:00
其实其他语言都是这样的,真正奇怪的那个是 js 。。。
v2byy
2020-04-03 18:04:23 +08:00
@Vegetable 谢谢回复。如果是静态语言,在 main 以外的 declaration 就算是 global 变量了,这样不管在函数里 definition,也就是在函数里赋值的话,会影响这个 global 变量。我开始以为 python 在函数里直接给一个已经声明的变量赋值,是可以改变这个"global"变量的。
black11black
2020-04-03 18:06:52 +08:00
@v2byy 看来 es6 不应该修正作用域问题,应该照你所说的“静态语言”来设计 ┓( ´∀` )┏
smallpython
2020-04-03 18:17:26 +08:00
如果不是这样设计的话, 就很有可能你在你自己写的函数里修改了其他函数里变量的值, 岂不是很危险嘛
fkdtz
2020-04-03 18:20:59 +08:00
python 的话,看看 LEGB 还有 COW 机制
liprais
2020-04-03 23:56:58 +08:00
楼主你猜猜这段代码里面打印出来啥
a = [1,2,3]
i = 0
for i in a:print(i)
print(i)
drizztdu
2020-04-04 00:29:40 +08:00
@liprais #12 和匿名函数中的变量绑定一个意思。
Gakho
2020-04-04 08:11:26 +08:00
函数内修改外部变量,不是怪胎 JS 的设计吗?
zhanlingjie
2020-04-08 14:04:56 +08:00
def func():
global a
a = 6

再试试看

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/659091

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX