python - 变量范围(局部全局和非局部)如何适用于 Python 中的 List 等可变对象?
问题描述
我正在编写如下程序来测试我对 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 + b
和a[0] = a[0] + b[0]
是不同的东西。
第一个是分配给一个全局变量,它实际上被 Python视为本地变量。详细信息可以在这篇文章中找到:Python 函数全局变量?
第二个是语法糖,不做作业!它被脱糖(内部翻译)调用
__setitem__
:a.__setitem__(0, a[0] + b[0])
如您所见,这里没有分配,上面的第 (1) 点不适用,所以这里没有问题。
一般来说,代码 likea[i] = b
会被翻译成a.__setitem__(i, b)
,而其他一些语法也会被翻译成函数调用,比如a + b
can be a.__add__(b)
、a[0]
isa.__getitem__(0)
等等。
所以,a[0] = a[0] + b[0]
最终将成为这个怪物:
a.__setitem__(0, a.__getitem__(0).__add__(b.__getitem__(0)))
没有赋值 - 全局变量突然变成本地没有问题。
推荐阅读
- java - Spring Cloud Data Flow - 在 CommandLineRunner 之前处理异常
- python - XGBoost超参数ValueError的优化:标签必须由形式为0、1、2、...、[num_class - 1]的整数标签组成
- powershell - 将 $MyInvocation.UnBoundArguments 传递给 Powershell 中的嵌套函数
- html - iOS 15 邮件中的图像 HTML
- php - 如何通过 POST 从表单中传递变量?
- r - R 中的 stem 函数是否正确处理大量计数?
- c# - 打印多页 C#
- php - 在自定义主键和外键中定义 Laravel 关系
- facebook-graph-api - Facebook 对话 API 发送者
- frontend - 如何在 OpenCart 3.x 最新版本中安装主题,因为它没有显示标题和产品页面