我们可以在 python 中不使用 global 关键字的情况下更新函数内部的可变数据类型(如列表)吗?

can we update mutable datatypes(like list) inside function without global keyword in python?

如果是,那么我们是否可以得出结论,在 python 中,我们可以在没有 global 关键字的情况下在程序内的任何地方更新可变数据类型,而没有 global 关键字,我们不能更新不可变数据类型?

global 关键字属于变量的范围,而不是可变性。 global 用于使局部分配的变量全局可用。

无论是否使用 global 关键字,您都无法修改不可变对象。您可以使用 global 重新分配外部作用域中的 variable,但这与修改 object 不同变量指向.

foo = 5
bar = foo

def update_foo():
    global foo
    foo += 3

print(foo, bar)  # 5 5
update_foo()
print(foo, bar)  # 8 5

在上面的例子中,我们使用global重新赋值了外部作用域中的foo变量,但是foo指向的实际对象并没有改变,这就是为什么bar 保留值 5.

将此与我们改变可变对象(如列表)时发生的情况进行比较:

foo = [5]
bar = foo

def update_foo():
    # "global foo" has no effect one way or the other here
    foo[0] += 3

print(foo, bar)  # [5] [5]
update_foo()
print(foo, bar)  # [8] [8]

请注意 global foo 不会在这里做任何事情,因为我们没有重新分配 变量 foo,而是修改 [=它指向的 39=]object (这是只有可变对象才有可能的东西——如果你尝试对元组执行 foo[0] += 3 ,你会得到一个错误,因为元组是不可变的).

如果我们重新分配 变量 foo:

foo = [5]
bar = foo

def update_foo():
    global foo
    foo = [foo[0] + 3]

print(foo, bar)  # [5] [5]
update_foo()
print(foo, bar)  # [8] [5]

然后 list 的行为与 int 的行为相同,因为我们实际上并没有修改底层对象,只是重新分配了一个变量以指向一个全新的对象。

必填项link:https://nedbatchelder.com/text/names.html