Python中的副作用

Python中的副作用,python,Python,我在python文档中读到: 为指定的变量要求全局变量提供了一个针对 意外的副作用 让我们把它写成代码: def double(n): global y y = 2 * n # this turns global as we have state y explicitly global y = 5 double(y) print y # outputs 10 我想再次检查我的理解,如果上面的代码有副作用,在全球y如果是这样 我觉得这与文档中的陈述相矛盾,基本上我认为为指定的变量要

我在python文档中读到:

为指定的变量要求全局变量提供了一个针对 意外的副作用

让我们把它写成代码:

def double(n):
  global y 
  y = 2 * n # this turns global as we have state y explicitly global

y = 5 
double(y)
print y # outputs 10
我想再次检查我的理解,如果上面的代码有副作用,在全球y如果是这样 我觉得这与文档中的陈述相矛盾,基本上我认为为指定的变量要求全局变量并不能防止副作用

如果我错了,请纠正我


谢谢

考虑一下这种情况,不同的人编写代码的不同部分

def func1(n):
    y = n+1
    print y

... many lines of code

def func2(a)
    return y * a

... many lines of code
y = 7
... many lines of code
func1(50)
... many lines
print func2(100)
如果没有明确的
global
声明,则
func1
中的
y
变量与总体
y
绑定,并且
func2(100)
的输出是5100,而不是预期的700;
func1
的副作用令
func2
的作者感到惊讶


显式全局声明可保护外部值,使其不会因编写者无意中更改而成为本地临时变量。

不,您误解了。以下是文档在上下文中的状态:

在Python中,只在函数中引用的变量是 隐式全局。如果为变量指定了一个值,则 函数体,假定它是局部函数,除非显式 宣布为全球

虽然一开始有点令人惊讶,但考虑一下就可以解释 这一方面,为指定的变量要求全局变量提供了 防止意外的副作用。另一方面,如果全球 对于所有全局引用都是必需的,您将在所有 时间您必须将对内置函数的每个引用都声明为全局引用 函数或导入模块的组件。这种杂乱无章的东西 挫败《全球宣言》在确定 副作用

分配给名称不需要
全局
。您可以在不使用
global
的情况下使用赋值,但文档告诉您,如果您在没有
global
指令的局部范围内使用赋值,则默认情况下,名称将被视为局部变量!推理如前所述,如果在默认情况下为函数内的变量赋值可能是全局的,那么您可能会意外地将其赋值给全局变量,并在不经意间造成副作用。但是如果您需要一个
global
指令,那么您就会知道您的函数会产生副作用。它并不是说
global
可以防止副作用,而是可以防止意外的副作用

为指定的变量要求全局变量提供了一个针对 意外的副作用

当文档说global提供了一个防止意外副作用的条时,这意味着它可以防止函数因名称别名而改变其外部作用域的情况

以下是一个例子:

x = 5

def safedouble(x)
    x = 2 * x
    return x

def unsafedouble(x)
    global x
    x = 2 * x
    return x

print(x) # 5
print(safedouble(x)) # 10
print(x) # 5 The x inside of the function does not interfere with x outside =)
print(unsafedouble(x)) # 10
print(x) # 10 ... do we really want this to happen?!

要求全局意味着,如果程序员明确要求,函数只会改变外部作用域。

不知道为什么这被否决,但我发现它提供了信息,并且符合指导原则。真的很好奇,因为没有太多的一致性,所以关于什么是好的QT(谢谢:)我很好奇,想知道我错过了什么。谢谢大家帮助我。