Python中的副作用

时间:2017-05-18 00:14:53

标签: python

我在python docs中阅读了这篇文章:Docs

  

要求全局指定变量提供了一个禁止   意外的副作用。

我们把它放在代码中:

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

如果上述代码在全球范围内具有副作用,我想仔细检查我的理解 我认为这与文档中的陈述相矛盾,基本上我认为要求全局分配变量并不能防止副作用。

如果我错了,请纠正我。

由于

3 个答案:

答案 0 :(得分:2)

不,你误解了。以下是文档在上下文中的含义:

  

在Python中,仅在函数内引用的变量是   隐含全球性。如果变量在其中的任何位置分配了值   函数的主体,除非明确指出,否则它被认为是本地的   宣布为全球。

     

虽然起初有点令人惊讶,但片刻的考虑解释了   这个。一方面,要求全局分配变量提供了一个   禁止意外的副作用。另一方面,如果全球化了   所有全局引用都需要,你将全局使用全局   时间。您必须将每个对内置的引用声明为全局   功能或导入模块的组件。这种混乱会   打败全球宣言的有用性   副作用。

分配名称​​不需要global 。您可以使用不带global的作业,但是文档告诉您如果您在没有global指令的情况下使用本地作业中的作业,则该名称将被视为本地名称默认变量!如上所述,如果赋值函数内部的变量默认为全局变量,那么您可能会意外地分配给全局变量并且无意中导致副作用。但是,如果您需要global指令,那么您将知道您的函数会产生副作用。它并未说明global 会阻止副作用,它会阻止无意的副作用

答案 1 :(得分:2)

  

要求全局分配变量提供了反对意见   意外的副作用。

当文档说全局提供了防止非预期副作用的条形时,这意味着它可以保护您免受因名称别名而导致函数更改其外部作用域的情况。

以下是一个例子:

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?!

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

答案 2 :(得分:0)

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

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声明,则y中的func1变量与整体y相关联,而func2(100)的输出则为5100而不是预期700:func1的副作用对func2的作者来说是一个惊喜。

明确的全局声明可以保护外部值免于无意中更改func1的编写者想要成为本地临时变量的内容。