fledgling 发表于 2022-3-11 10:07:05

有关全局变量的global语句

def func():
    global a
    a = 2
    print(a*5)
func()
print(a)

为什么在这个语句中,只要打印倒数第二行的func语句,整个程序就能运行了,不打印倒数第二句,就会提示没有定义a?

isdkz 发表于 2022-3-11 10:12:55

因为你不执行 func 的话,a 还没有定义(赋值),所以 print(a) 就会出错。

你不一定要调用 func,只要 a 定义了就行。

def func():
    global a
    a = 2
    print(a*5)
a = 6          # 注意这里
print(a)

fledgling 发表于 2022-3-11 10:17:01

isdkz 发表于 2022-3-11 10:12
因为你不执行 func 的话,a 还没有定义(赋值),所以 print(a) 就会出错。

你不一定要调用 func,只要...

只要声明global,变量不就是全局变量,就能在函数外使用了吗?

isdkz 发表于 2022-3-11 10:27:23

fledgling 发表于 2022-3-11 10:17
只要声明global,变量不就是全局变量,就能在函数外使用了吗?

但是你还没有执行函数的话,函数里面的代码块是还没有执行的呀,

所以没有执行过函数 func 的话, a 就不存在

jackz007 发表于 2022-3-11 10:41:56

fledgling 发表于 2022-3-11 10:17
只要声明global,变量不就是全局变量,就能在函数外使用了吗?

      在函数块内定义的变量属于本函数,一般是局部变量,只有不在任何函数内定义的变量才是全局变量,global 只能用于在函数内对位于函数外的全局变量进行声明。

甲鱼python 发表于 2022-3-11 10:54:33

本帖最后由 甲鱼python 于 2022-3-11 11:00 编辑

定义函数后你没有调用函数func a本身不存在 你在函数外部没有对a进行定义 无法输出a的值 global能函数func内部影响外部全局变量的值 也就是说你在外部定义a的值 调用函数后 可以在函数内部修改函数外全局变量a的值

isdkz 发表于 2022-3-11 10:55:32

jackz007 发表于 2022-3-11 10:41
在函数块内定义的变量属于本函数,一般是局部变量,只有不在任何函数内定义的变量才是全局变量,gl ...

你这么说不对吧,global 声明只是会让对这个变量造成的影响扩散到全局而已,

不是只能用于在函数内对位于函数外的全局变量进行声明

jackz007 发表于 2022-3-11 11:11:22

本帖最后由 jackz007 于 2022-3-11 11:21 编辑

isdkz 发表于 2022-3-11 10:55
你这么说不对吧,global 声明只是会让对这个变量造成的影响扩散到全局而已,

不是只能用于在函数内对 ...

       对这个变量造成的影响扩散到全局???
       Python 通过变量赋值来定义变量,所以,在函数内部使用变量的时候,必须先赋值,然后再访问。如果对一个变量未赋值就访问,那么,这个变量会被当作只读的全局变量,这个时候,如果在函数外并没有发现同名变量,Python 就会报错。
      在函数内部,如果事先对一个变量使用 global 、nonlocal 关键字进行声明,在对该变量进行赋值的时候,就会阻止同名局部变量的创建,该函数内部所有对这个变量的赋值和访问,直接使用位于函数外部的同名变量,这个时候,如果函数外部并不存在这个同名变量,Python 同样也会报错。

isdkz 发表于 2022-3-11 11:26:00

本帖最后由 isdkz 于 2022-3-11 11:28 编辑

jackz007 发表于 2022-3-11 11:11
对这个变量造成的影响扩散到全局???
       Python 通过变量赋值来定义变量,所以,在函数 ...

你没听明白我的意思吗?我说的对这个变量的影响就是改变变量的指向,赋值操作就是改变变量指向的操作,

如果按你所说,只能对函数外的全局变量进行声明的话,那 global 声明的变量得在全局存在,

事实是这个变量即使不存在也并不会有什么问题,下面这个函数是可以定义成功的:
def test():
    global a

也就改变变量指向的操作会分 全局、非局部 和 局部,

而 global、nonlocal 这样的声明只是将这种改变变量指向的影响扩散到更大的命名空间而已

jackz007 发表于 2022-3-11 11:27:42

isdkz 发表于 2022-3-11 11:26
你没听明白我的意思吗?我说的对这个变量的影响就是改变变量的指向,赋值操作就是改变变量指向的操作, ...

      试一下这个代码
def abc():
    global x
    x = 8
    print(x)

abc()

isdkz 发表于 2022-3-11 11:29:32

jackz007 发表于 2022-3-11 11:27
试一下这个代码

这个你想表达什么?

jackz007 发表于 2022-3-11 11:33:36

isdkz 发表于 2022-3-11 11:29
这个你想表达什么?

      全局变量 x 必须实际存在于函数 foo() 之外。

isdkz 发表于 2022-3-11 11:41:04

本帖最后由 isdkz 于 2022-3-11 11:44 编辑

jackz007 发表于 2022-3-11 11:33
全局变量 x 必须实际存在于函数 foo() 之外。

那个代码只能证明你说的不对吧,x 在声明之前并不存在于
foo 之外,

它加了个 global 声明把对 x 的指向扩散到全局了

jackz007 发表于 2022-3-11 11:46:29

isdkz 发表于 2022-3-11 11:41
那个代码只能证明你说的不对吧,x 在声明之前并不存在于
foo 之外,



      麻烦你以后不要再对我说话了。

isdkz 发表于 2022-3-11 12:00:24

jackz007 发表于 2022-3-11 11:46
麻烦你以后不要再对我说话了。

各有各的见解嘛,你要是觉得我说的不对你可以理论,

你说这话算怎么回事你{:5_96:}
页: [1]
查看完整版本: 有关全局变量的global语句