全局字典不需要关键字 global 来修改它们? [英] Global dictionaries don't need keyword global to modify them?

查看:28
本文介绍了全局字典不需要关键字 global 来修改它们?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道为什么不用 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 来修改它们?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆