gpt4 book ai didi

python - 变量范围(局部全局和非局部)如何适用于 Python 中的 List 等可变对象?

转载 作者:行者123 更新时间:2023-12-04 10:29:04 24 4
gpt4 key购买 nike

我正在编写如下程序来测试我对 Python 变量范围的了解

def show(a,b):
def add():
a = a+b #Error at this line "UnboundLocalError: local variable 'a' referenced before assignment"
#I know we can use nonlocal a,b to avoid error
add()
print("a=",a)
x=4
y=2
show(x,y)

然后我尝试了相同的程序,并以 x 和 y 作为列表进行了一些小改动。代码如下图
def show(a,b):
def add():
a[0] = a[0]+b[0] #No Error at this line
add()
print("a=",a[0])

x=[4]
y=[2]
show(x,y)

这段代码运行良好。我在 python 中没有得到这种奇怪的行为。

最佳答案

所有变量的范围规则都相同。它们引用什么对象并不重要。

然而,a = a + ba[0] = a[0] + b[0]是不同的东西。

  • 第一个是分配给一个全局变量,该变量实际上被 Python 视为本地变量。详细信息可以在此帖子中找到:Python function global variables?
  • 第二个是语法糖,不做作业!它已脱糖(内部翻译)至 __setitem__ :
    a.__setitem__(0, a[0] + b[0])

    正如您所看到的,这里没有分配,上面的第 (1) 点不适用,所以这里没有问题。

  • 一般来说,像 a[i] = b 这样的代码将被翻译成 a.__setitem__(i, b) ,还有一些其他语法也被翻译成函数调用,比如 a + b可以 a.__add__(b) , a[0]a.__getitem__(0)等等。

    所以, a[0] = a[0] + b[0]最终会成为这个怪物:
    a.__setitem__(0, a.__getitem__(0).__add__(b.__getitem__(0)))

    没有赋值 - 全局变量突然变成局部没有问题。

    关于python - 变量范围(局部全局和非局部)如何适用于 Python 中的 List 等可变对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60495812/

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