gpt4 book ai didi

python - 全局字典不需要关键字 global 来修改它们吗?

转载 作者:IT老高 更新时间:2023-10-28 22:00:25 30 4
gpt4 key购买 nike

我想知道为什么我可以在没有 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)

给出以下结果:

me@pc:~/$ ./globalDict.py 
{'key2': 2, 'key1': 1}
{'key2': 2, 'key1': 2} # Dictionary value has been changed
mod
bar
mod

我期望的地方:

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

最佳答案

原因是行

stringvar = "bar"

是不明确的,它可能是指一个全局变量, 它可能是创建一个名为 stringvar 的新局部变量。在这种情况下,Python 默认假定它是一个局部变量,除非已经使用了 global 关键字。

但是,行

dictvar['key1'] += 1

完全没有歧义。它只能引用全局变量 dictvar,因为 dictvar 必须已经存在才能使语句不抛出错误。

这不是特定于字典的——列表也是如此:

listvar = ["hello", "world"]

def listfoo():
listvar[0] = "goodbye"

或其他种类的物体:

class MyClass:
foo = 1
myclassvar = MyClass()

def myclassfoo():
myclassvar.foo = 2

只要 mutating operation is used rather than a rebinding one .

关于python - 全局字典不需要关键字 global 来修改它们吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14323817/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com