nik*_*nik 279 python global-variables
我从阅读文档中了解到,Python有一个单独的函数命名空间,如果我想在该函数中使用全局变量,我需要使用global.
我正在使用Python 2.7,我尝试了这个小测试
>>> sub = ['0', '0', '0', '0']
>>> def getJoin():
... return '.'.join(sub)
...
>>> getJoin()
'0.0.0.0'
Run Code Online (Sandbox Code Playgroud)
即使没有,事情似乎也很好global.我能够毫无问题地访问全局变量.
我错过了什么吗?另外,以下是来自Python文档:
全局语句中列出的名称不能定义为形式参数,也不能定义为for循环控制目标,类定义,函数定义或import语句.
虽然形式参数和类定义对我有意义,但我无法理解for循环控制目标和函数定义的限制.
uno*_*ode 356
该关键字global仅对在本地上下文中更改或创建全局变量很有用,尽管创建全局变量很少被认为是一个很好的解决方案.
def bob():
me = "locally defined" # Defined only in local context
print me
bob()
print me # Asking for a global variable
Run Code Online (Sandbox Code Playgroud)
以上将给你:
locally defined
Traceback (most recent call last):
File "file.py", line 9, in <module>
print me
NameError: name 'me' is not defined
Run Code Online (Sandbox Code Playgroud)
如果使用该global语句,变量将在函数范围之外"可用",有效地成为全局变量.
def bob():
global me
me = "locally defined" # Defined locally but declared as global
print me
bob()
print me # Asking for a global variable
Run Code Online (Sandbox Code Playgroud)
所以上面的代码会给你:
locally defined
locally defined
Run Code Online (Sandbox Code Playgroud)
此外,由于python的本质,您还可以使用global在本地上下文中声明函数,类或其他对象.虽然我会反对它,因为如果出现问题或需要调试它会导致噩梦.
Ivo*_*zel 208
虽然您可以在不使用global关键字的情况下访问全局变量,但如果要修改它们,则必须使用global关键字.例如:
foo = 1
def test():
foo = 2 # new local foo
def blub():
global foo
foo = 3 # changes the value of the global foo
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您只是访问列表sub.
pyc*_*uft 72
这是访问名称和在范围内绑定它之间的区别.
如果您只是查找变量来读取其值,则可以访问全局和本地范围.
但是,如果您为名称不在本地范围内的变量分配,则将该名称绑定到此范围(如果该名称也作为全局存在,则会隐藏该名称).
如果您希望能够分配全局名称,则需要告诉解析器使用全局名称而不是绑定新的本地名称 - 这就是'global'关键字的作用.
绑定块中的任何位置都会导致该块中的所有名称都被绑定,这可能会导致一些相当奇怪的后果(例如,UnboundLocalError突然出现在以前工作的代码中).
>>> a = 1
>>> def p():
print(a) # accessing global scope, no binding going on
>>> def q():
a = 3 # binding a name in local scope - hiding global
print(a)
>>> def r():
print(a) # fail - a is bound to local scope, but not assigned yet
a = 4
>>> p()
1
>>> q()
3
>>> r()
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
r()
File "<pyshell#32>", line 2, in r
print(a) # fail - a is bound to local scope, but not assigned yet
UnboundLocalError: local variable 'a' referenced before assignment
>>>
Run Code Online (Sandbox Code Playgroud)
kin*_*all 51
其他答案回答了你的问题.关于Python中名称的另一个重要事项是,它们在每个范围的基础上是本地的或全局的.
考虑一下,例如:
value = 42
def doit():
print value
value = 0
doit()
print value
Run Code Online (Sandbox Code Playgroud)
您可能猜测该value = 0语句将分配给局部变量,而不会影响在doit()函数外声明的同一变量的值.您可能会更惊讶地发现上面的代码无法运行.print value函数内部的语句产生一个UnboundLocalError.
原因是Python已经注意到,在函数的其他地方,您指定了名称value,并且也value没有声明global.这使它成为一个局部变量.但是当您尝试打印它时,尚未定义本地名称.在这种情况下, Python 不会像其他语言那样回归到将名称作为全局变量查找.实际上,如果在函数中的任何位置定义了同名的局部变量,则无法访问全局变量.
use*_*312 14
访问名称和分配名称是不同的.在您的情况下,您只是访问一个名称.
如果分配给函数中的变量,则假定该变量是本地变量,除非您将其声明为全局变量.如果没有,则假定它是全球性的.
>>> x = 1 # global
>>> def foo():
print x # accessing it, it is global
>>> foo()
1
>>> def foo():
x = 2 # local x
print x
>>> x # global x
1
>>> foo() # prints local x
2
Run Code Online (Sandbox Code Playgroud)
global例:
words = [...]
def contains (word):
global words # <- not really needed
return (word in words)
def add (word):
global words # must specify that we're working with a global keyword
if word not in words:
words += [word]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
377123 次 |
| 最近记录: |