问题描述
我想知道为什么不用 global
关键字就可以更改全局字典?为什么它对其他类型是强制性的?这背后有什么逻辑吗?
例如代码:
#!/usr/bin/env python3stringvar = "mod"dictvar = {'key1': 1,'key2':2}定义 foo():dictvar['key1'] += 1定义栏():stringvar = "bar"打印(字符串变量)打印(字典变量)富()打印(字典变量)打印(字符串变量)酒吧()打印(字符串变量)
给出以下结果:
me@pc:~/$ ./globalDict.py{'key2':2,'key1':1}{'key2': 2, 'key1': 2} # 字典值已更改模组酒吧模组
我期望的地方:
me@pc:~/$ ./globalDict.py{'key2':2,'key1':1}{'key2': 2, 'key1': 1} # 我没有使用全局,所以字典保持不变模组酒吧模组
原因是线路
stringvar = "bar"
不明确,它可能指的是一个全局变量,或它可能创建一个名为 stringvar
的新局部变量.在这种情况下,除非已经使用了 global
关键字,否则 Python 默认假设它是一个局部变量.
然而,行
dictvar['key1'] += 1
完全没有歧义.它可以只引用全局变量 dictvar
,因为 dictvar
必须已经存在,语句才不会抛出错误.
这并非特定于字典 - 列表也是如此:
listvar = ["hello", "world"]def listfoo():listvar[0] = "再见"
或其他类型的对象:
class MyClass:富 = 1myclassvar = MyClass()def myclassfoo():myclassvar.foo = 2
每当使用变异操作而不是重新绑定操作时都是如此.>
I wonder why I can change global dictionary without global
keyword? Why it's mandatory for other types? Is there any logic behind this?
E.g. code:
#!/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)
Gives following results:
me@pc:~/$ ./globalDict.py
{'key2': 2, 'key1': 1}
{'key2': 2, 'key1': 2} # Dictionary value has been changed
mod
bar
mod
where I would expect:
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
The reason is that the line
stringvar = "bar"
is ambiguous, it could be referring to a global variable, or it could be creating a new local variable called stringvar
. In this case, Python defaults to assuming it is a local variable unless the global
keyword has already been used.
However, the line
dictvar['key1'] += 1
Is entirely unambiguous. It can be referring only to the global variable dictvar
, since dictvar
must already exist for the statement not to throw an error.
This is not specific to dictionaries- the same is true for lists:
listvar = ["hello", "world"]
def listfoo():
listvar[0] = "goodbye"
or other kinds of objects:
class MyClass:
foo = 1
myclassvar = MyClass()
def myclassfoo():
myclassvar.foo = 2
It's true whenever a mutating operation is used rather than a rebinding one.
这篇关于全局字典不需要关键字 global 来修改它们?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!