python给全局变量赋值,Python中全局变量

  python给全局变量赋值,Python中全局变量

  在python中,变量的范围有些不同。

  在C/C和java等编程语言中,默认情况下,可以在函数内部直接访问函数外部定义的全局变量,但这在python中会有问题。下面是一个例子。

  测试. py:

  #!/usr/hsdfk/python

  计数=1

  定义函数():

  计数=计数1

  函数()

  Python test.py .将执行一个错误:

  回溯(最近一次呼叫):

  文件 test.py ,第8行,在

  函数()

  func中文件 test.py 的第6行

  计数=计数1

  unboundlocalrerror:在赋值前引用了局部变量“count”unboundlocalrerror:在赋值前引用了局部变量“COUNT”意味着在赋值前引用了变量COUNT。

  以下是python不同于其他编程语言的地方。像C/C这样的编程语言。变量名实际上是它所代表的内存区域。给这个变量赋值意味着将新值放入这个变量指定的内存区域。而对于python来说。的所有变量都是对内存区域的引用,给变量赋值相当于把变量引用的内存从一个区域换到另一个存储新值的区域。

  也就是说,在C/C中,变量名和内存区域的对应关系不会改变,只会改变对应内存中存储的值;然而,在python中,变量只是对存储其值的内存区域的引用。变量值的变化并不是因为变量所指向的内存区域中的值发生了变化,而是变量引用了存储新值的新内存区域。

  python中的所有变量都相当于java中的不可变变量。无论值发生什么变化,都会对应变量的引用内存区域的变化。

  例如,差异如下图1所示:

  图1变量比较

  python里有id函数,python里有id函数。帮助(id)可以看到它的描述。例如,以下内容:

  模块__builtin__中内置函数id的帮助:

  id(.)

  id(对象)-整数

  返回对象的标识。这在同时存在的对象中保证是唯一的。(提示:这是对象的内存地址。)

  (完)简单来说,id函数反映的是对象的内存地址。请看下面的实验结果:

  测试. py:

  #!/usr/hsdfk/python

  计数=1

  对于范围(5)中的I:

  计数=计数1

  打印id(计数)

  python.py的执行结果:

  11031328

  11031304

  11031280

  11031256

  1031232这与上图一致。python中的每一次赋值都会改变变量引用的内存空间。

  回到上面的“赋值前引用”错误,发生这个错误是因为python在函数中找到了COUNT变量的赋值。它将被添加到函数的本地名称空间中(实际上,这发生在函数执行赋值操作之前)。

  当执行赋值操作时。赋值操作符的右边是计数变量。此时COUNT变量只添加到函数的局部命名空间中,而没有详细赋值,所以会出现上面的错误。实际上。问题在于赋值操作,它导致变量被添加到函数的局部命名空间中。假设没有赋值,只是引用变量,没有问题,比如如下:

  测试. py:

  #!/usr/hsdfk/python

  计数=1

  定义函数():

  温度=计数1

  打印“温度:”计数

  打印“计数:”,计数

  函数()

  python.py的执行结果:

  温度:1

  COUNT: 1这样一来,COUNT变量就不会添加到函数的本地命名空间中,python解释器也不会在函数的本地命名空间中找到它。然后。Python解释器会继续在全局命名空间中搜索,结果会在全局命名空间中找到COUNT的定义并引用它的值,所以程序执行没有问题。

  此时你可能会问,难道不能改变函数中全局变量的值吗?不,假设要改变函数中全局变量的值,需要在函数中对变量进行全局声明,告诉python解释器该变量在全局命名空间中,如下:

  测试. py:

  #!/usr/hsdfk/python

  计数=1

  定义函数():

  全局计数

  计数=计数1

  打印“计数:”,计数

  函数()

  python test.py执行结果:

  数数:20k .^_^

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: