我从阅读文档中了解到,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循环控制目标和函数定义的限制.
以下代码在Python 2.5和3.0中按预期工作:
a, b, c = (1, 2, 3)
print(a, b, c)
def test():
print(a)
print(b)
print(c) # (A)
#c+=1 # (B)
test()
Run Code Online (Sandbox Code Playgroud)
但是,当我取消注释行(B)时,我得到了UnboundLocalError: 'c' not assigned一行(A).的值a和b被正确地打印.这让我感到困惑,原因有两个:
为什么在行(A)处抛出运行时错误,因为后面的行(B)语句?
为什么变量a和b打印符合预期,同时c引发错误?
我能想到的唯一解释是,赋值创建了一个局部变量,即使在创建局部变量之前,它也优先于"全局"变量.当然,变量在存在之前"窃取"范围是没有意义的.cc+=1c
有人可以解释一下这种行为吗?
可能重复:
为什么在这种情况下不需要全局关键字?
我想知道为什么我可以在没有global关键字的情 为什么它对其他类型是强制性的?这背后有什么逻辑吗?
例如代码:
#!/usr/bin/env python3
stringvar = "mod"
dictvar = {'key1': 1,
'key2': 2}
def foo():
dictvar['key1'] += 1
def bar():
stringvar = "bar"
print(stringvar)
print(dictvar)
foo()
print(dictvar)
print(stringvar)
bar()
print(stringvar)
Run Code Online (Sandbox Code Playgroud)
给出以下结果:
me@pc:~/$ ./globalDict.py
{'key2': 2, 'key1': 1}
{'key2': 2, 'key1': 2} # Dictionary value has been changed
mod
bar
mod
Run Code Online (Sandbox Code Playgroud)
我期待的地方:
me@pc:~/$ ./globalDict.py
{'key2': 2, 'key1': 1}
{'key2': 2, 'key1': 1} # I didn't use global, so dictionary remains the same
mod
bar
mod
Run Code Online (Sandbox Code Playgroud) 当我写这段代码时:
polly = "alive"
palin = ["parrot", polly]
print(palin)
polly = "dead"
print(palin)
Run Code Online (Sandbox Code Playgroud)
我以为它会输出这个:
"['parrot', 'alive']"
"['parrot', 'dead']"
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.如何输出它?
这是一种奇怪的行为.
试试这个 :
rep_i=0
print "rep_i is" , rep_i
def test():
global rep_i #without Global this gives error but list , dict , and others dont
if rep_i==0:
print "Testing Integer %s" % rep_i
rep_i=1
return "Done"
rep_lst=[1,2,3]
def test2():
if rep_lst[0]==1:
print "Testing List %s" % rep_lst
return "Done"
if __name__=="__main__":
test()
test2()
Run Code Online (Sandbox Code Playgroud)
为什么列表不需要声明全局?他们是自动全球的?
我发现它真的很奇怪,我大部分时间都使用列表,我甚至根本不使用全球它们作为全球.....
好吧,所以我有一个非常讨厌的问题,其中一个变量在本地设置,但然后在该函数之外恢复到它的旧自我(在这种情况下为None),但同时我可以操纵其他变量仍然可以不使用"全球"关键字.
我不能提供真正的代码,但它是这样的:
foo = {}
foo_foo = {}
bar = None
def changes_foo():
...do some stuff to foo...
class EditThread(threading.Thread):
def __init__(self):
setup()
def run(self):
for key, value in foo.items():
do_update_task(key, value)
def do_update_task(self, key, value):
...do some editing too foo...
del foo[key]
bar = [key, value]
foo_foo[key] = value
def print_the_bar():
print bar
Run Code Online (Sandbox Code Playgroud)
请注意所有的操作foo和foo_foo工作正常,但是当我调用时,bar仍然是None print_the_bar,并且我的代码中有很多打印语句来验证内部的bar do_update_task确实具有正确的值而不是None.
有人可以向我解释为什么会这样吗?
我收到以下错误:
Warning (from warnings module):
File "C:\Python34\projectEuler\projectEuler.py", line 316
global primeSet, primeList, primeCap, primeRan
SyntaxWarning: name 'primeRan' is used prior to global declaration
Run Code Online (Sandbox Code Playgroud)
对于代码:
primeSet = {2, 3}
primeList = [2, 3]
primeCap = 3
primeRan = False
def primeGen():
if primeRan:
primeList, primeCap = primeList, PrimeCap
global primeSet
else:
global primeSet, primeList, primeCap, primeRan
primeRan = True
for i in primeList:
yield i
while(True):
primeCap += 2
m = int(primeCap**.5)
yesPrime = True
for p in primeList:
if p …Run Code Online (Sandbox Code Playgroud) python ×7
global ×2
list ×2
scope ×2
variables ×2
dictionary ×1
python-2.7 ×1
python-3.x ×1
syntax-error ×1