全局变量中的可变与不可变类型的区别

3
以下是对可变和不可变对象中global的正确理解吗?
immutable1 = 'abc'
immutable2 = '123'
mutable = {}

def change():    
    mutable['CHANGED'] = 'CHANGED' # this will change the global variable mutable
    global immutable1
    immutable1 = 'abc-CHANGED' # this will change the global variable immutable1 because global has been called
    immutable2 = '123-CHANGED' # this will not change the global immutable2 variable, because it's immutable and global has not bee declared

global 的唯一用途是修改全局不可变变量吗?还是它可以在其他情况下使用?

另一个例子:

>>> m={}
>>> i='a'
>>> 
>>> def change():
...     m['a'] = i
...     i = 'b'
... 
>>> print(m,i)
{} a
>>> change()
UnboundLocalError: local variable 'i' referenced before assignment
1个回答

7

global 与可变性无关,它只改变一个 名称作用域,不论这个名称对应可变或不可变的对象,因此您可以将一个新值赋给该名称。

在给一个全局名称赋值时,旧值可能是可变的也可能是不可变的,而新值也可以是可变的或不可变的。

d = {}
e = 6

def change():
    global d, e
    d = 3
    e = []

我如何能够在不调用字符串上的global的情况下改变可变字典,但不能改变不可变字符串? - user10870615
3
你必须区分更改名称所指的内容和修改已被名称所指的对象。mutable['CHANGED'] = 'CHANGED' 不会更改 mutable 所绑定的内容;它只是修改了现有的对象。从技术上讲,这不是一次赋值操作;而是一个特殊语法用于调用方法 mutable.__setitem__('CHANGED', 'CHANGED') - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接