关于python作用域



我读过关于python作用域的文章,也浏览过stackoverflow上的问题,但我想澄清一下。

我正在为一个函数提取一段代码,从我过去的代码中,它应该将所有使用的变量作为参数。但是,在python中,变量地址是在运行时确定的,因此实际上不需要参数。由于我是python的新手,我想知道是否还有其他的含义或约定我应该知道。

x = 5
x += 1
print x

以下对上述代码的重构有什么区别吗:

def f(x):
x += 1
return x
x = 5
x = f(x)
print x

和:

def f():
x++
x = 5
f()
print x

如果不是,那么在python中,其中一种方法是更常用还是更受欢迎?

如果不是绝对必要的话,最好不要使用全局变量也就是说,在第二个示例中,您需要在引用x之前声明global x

所以,第一种方法:

  • f采用参数x
  • 增量x
  • 返回x + 1
  • 全局CCD_ 7不受影响

第二种方式:

def f():
global x
x += 1
x = 1
f()
  • f没有参数
  • 增加全局x

p.S.Python没有++运算符。使用x += 1代替

我对这个问题投赞成票有两个原因:

1)

  • 从其他语言(C++和Java)导入表示法x++是一种轻微的罪过;谁从不心不在焉
  • 不测试代码应该被否决,这是正确的,因为这意味着没有进行任何测试来试图获得一定数量的观察结果,这就是baaad
  • 然而,我发现理解有关作用域、名称空间、全局/本地的概念的愿望比要指责的错误更值得称赞

2)

根据我的说法,因为一个近似问题而被否决,而得到的答案却包含了一些不充分的术语,这无疑是一种不令人满意的情况。术语在可能发生争议性辩论和混淆性描述的主题中尤为重要。

例如,对于

def f(x): 
x++ 
return x
  • 我不会说f接收参数x,但fx作为参数接收
  • x不递增;相反:创建的另一个对象的值是初始x值的增量

  • f不返回x+1,它返回具有递增值的新对象

编辑1

#f采用参数x

在调用f(x)中,我不会说f接收参数x,因为x不是绝对参数x在传递给函数的那一刻"成为"一个与函数相关的参数。所以我宁愿说,在调用f(x)中,函数f接收xAS一个参数。

可能会有人说"自变量Y">一次,这是对的一种轻描淡写的表达,当它作为自变量传递给函数">时。这种轻描淡写的说法比较简短;但我认为,在一个精确的解释中,这种简单的表达方式必须被禁止。

#增量x

参考问题(案例1)中编写的代码,这句话是模棱两可的,因为用参数x编写的函数:x是指函数中的x还是指函数外的x是通过值传递还是通过引用传递?可能是f内部的操作可以改变x外部,为什么不呢,这正是讨论中的内容,不是吗?这就是为什么最好将f的参数命名为与外部对象的任何名称不同的名称;我认为与前一句相同:在准确的解释中,只应使用谨慎的句子和代码,以避免混淆歧义:

def f(N):
N += 1
return N
x = 5
x = f(x)
print x

应该解释的是,指令N += 1触发了值递增的新对象的创建,并且本地标识符N被反弹到这个新对象。此时,全局标识符x仍然绑定到与调用前相同的对象。

#返回x+1

f不返回x+1,它返回新分配给N的新对象,并增加值

#全局x不受影响

这是什么意思?之前,全局x的值为5。之后,全局x的值为6。在f内部执行操作的过程中,全局x不受影响,没错:只有当新对象(实际上是其地址..)返回到f外部,并且执行赋值x = f(x)时,全局x才会受到影响。但是这句"全局x不受影响">放在之后"返回x+1">。不,真的,我不理解这样的解释。

第1版结束

关于第二种情况

def f():
global x 
x += 1
  • 我更喜欢说f没有参数,而不是没有参数
  • 它不会增加全局标识符x,而是将全局标识符
    x新分配给具有增量值的新对象

编辑2

在这种情况下,不可能在函数中使用x以外的其他名称,否则示例将意味着另一回事。

def f():
global x
x += 1
x = 5
f()
print x

#f没有参数

我为什么写"我更喜欢说f没有参数,而不是没有参数">来评论这一点?我仍然在想。起初,我写了"我更喜欢说f没有参数,而不是没有自变量">,思考f的定义。我不知道为什么,我通过颠倒句子来"纠正",结果没有表达我的想法。我完全感到困惑。

准确地说,我认为正确的表达方式是:

  • 在函数的定义中,f->HAS无参数,

  • 在调用f()中,f->RECEIVES没有参数。

#增加全局x

它不会增加全局标识符x,而是将全局标识符
x新分配给具有增量值的新对象。

第2版结束

这似乎是细微的差别,我相信这是一种以浓缩的方式表达事物的方式。

但对我来说,这是非常重要的,因为当我还是一个新手时,我遇到了很多困难,因为这种不精确的理解与Python的特殊数据模型相关的所有问题,这些问题在Python的官方文档中解释得很糟糕,在awkard讨论中也有争议,比如关于"按值传递或按引用传递"的例子(在Python中没有意义),其中术语从右到左、从左到右浮动,就像在模糊的海洋中一样。

最新更新