从果壳中的Python:
Eschew global
永远不要使用全局如果函数体只使用全局 变量(包括变异绑定到的对象 变量,当对象是可变的时)。
仅在使用全局声明时 函数体重新绑定全局变量(通常通过赋值给变量的名称)。
"使用"之间的含义和区别是什么?和"重新绑定"变量?
是"变异绑定到变量的对象" "使用"或"重新绑定"变量?为什么呢?
答案 0 :(得分:3)
“Mutate”和“bind”/“rebind”是两个相互排斥的操作。变异会更改对象,而绑定会更改名称。
这是具有约束力的:
a = []
这是变异的:
a.append(None)
“使用”表示访问绑定到名称的现有对象,无论是读取还是突变。
答案 1 :(得分:1)
当您使用变量 时,您正在使用变量的实际值 - 它引用的对象 - 或者变量变量名称引用的对象< / EM> 即可。这是一个例子:
>>> var1 = 1
>>> var2 = [1]
>>>
>>> def func():
print(var1)
var2.append(2)
>>> func()
1
>>> var2
[1, 2]
>>>
在上面的示例中,我们在var1
内使用 var2
和func
。我们使用var1
,因为我们在调用print
时使用了它的值。我们使用var2
因为我们改变了它所引用的对象。请注意,我们没有更改var2
引用的对象,我们使用已存在的对象并对其进行了修改。另请注意,我们从未尝试将 new 值分配给任一变量。
当您重新绑定变量 时,您正在更改变量名称所指的对象 。这是另一个帮助说明这一点的例子:
>>> var1 = 1
>>>
>>> def func():
global var1
var1 = 2
>>> func()
>>> var1
2
>>>
在上面的例子中。我们正在var
内重新绑定func
。 var1
用于引用对象1
,但由于我们将var1
重新绑定到2
,它现在引用对象2
。
不同之处在于,当我们使用变量时,我们只是使用变量已经引用的对象。当我们重新绑定变量时,我们更改变量引用的对象。