python新手提问-关于函数

wyptyg 2017-11-27 03:30:46
纯粹新手,术语存在很多不严谨的地方,大家谅解。

在我理解中,在python中,如果函数中涉及到的变量在函数中没有赋值,就会采纳全局中的赋值,比如
a= 12
def f(x):
c=x+a
return c
print f(2)
print a
运行后为 14 \n 12
如果函数中的变量在函数中已经赋值了,就会使用在函数内的赋值,比如
a= 12
def f(x):
a=3
c=x+a
return c
print f(2)
print a
但是如果下面这样就会显示语法错误。
a= 12
def f(x):
c=x+a
a=3
return c
print f(2)
print a
求问诸位大神,python应该是逐行解释逐行执行的,在执行到c=x+a这一句的时候电脑应该是不知道还有a=3这一句的,那为什么还会显示语法错误,而不是根据全局中的a=12把c=x+12的值算出来?
谢谢大家!
...全文
143 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
python_tty 2017-11-27
  • 打赏
  • 举报
回复
看看global的用法
混沌鳄鱼 2017-11-27
  • 打赏
  • 举报
回复
Python脚本实际上并不是完全按语句一句一句执行的。 Python的执行是先把脚本编译成字节码,然后按字节码的顺序执行。 把脚本编译成字节的过程解器要做很多加工和调整的,例如有的代码在import时候就直接执行了。 对于在函数内的变量会按照个规则来决定是全局还是局部变量,就是看函数内 有无赋值 如果函数内任意地方有赋值 那么这个被解释为局部变量 如果函数内没有赋值 函数之前有赋值 将被解释为全局变量 同一个作用域(例如一个函数内的变量)同一个变更名不能一会儿是全局变量 一会儿是局部变量 看一下实例:

>>> a = 12
>>> def foo(x):
	c = x + a
	return c

>>> def bar(x):
	c = x + a
	a = 2
	return c

>>> import dis
>>> dis.dis(foo)
  2           0 LOAD_FAST                0 (x)
              2 LOAD_GLOBAL              0 (a)
              4 BINARY_ADD
              6 STORE_FAST               1 (c)

  3           8 LOAD_FAST                1 (c)
             10 RETURN_VALUE
>>> dis.dis(bar)
  2           0 LOAD_FAST                0 (x)
              2 LOAD_FAST                1 (a)
              4 BINARY_ADD
              6 STORE_FAST               2 (c)

  3           8 LOAD_CONST               1 (2)
             10 STORE_FAST               1 (a)

  4          12 LOAD_FAST                2 (c)
             14 RETURN_VALUE

dis模块可以反编译出函数对象的字节码, 在上面的foo字节码中,如果在函数中a是LOAD_GLOBAL 0 (a)引用的全局变量。 而下面的bar中 a 由于在下面有附值语句,就变成了 LOAD_FAST 1 (a),a也就成了局部变量。 但是却在下面的 STORE_FAST 1 (a) 赋值之前就引用,就会报错了, UnboundLocalError: local variable 'a' referenced before assignment 意思是:局部变量在赋值前引用。
oyljerry 2017-11-27
  • 打赏
  • 举报
回复
会做解释执行,但没说是完全一行行的,会有代码分析。语法树

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧