首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数-变量-作用域

函数-变量-作用域
EN

Stack Overflow用户
提问于 2021-02-19 04:52:49
回答 2查看 25关注 0票数 0

我有下面的代码。

代码语言:javascript
复制
a = 10
def f(x):
    return x + a
a = 3
f(1)

如果我们打印(F1),结果是4。这里似乎使用了a的第二个赋值(a=3)。有人能给我解释一下不使用第一个赋值(a=10)有什么特殊的原因或规则吗?

谢谢,

迪米特里奥斯

EN

回答 2

Stack Overflow用户

发布于 2021-02-19 04:56:16

每次执行return x + a时都会解析ax。在调用f之前重新分配af知道a不是一个局部变量,所以在它的封闭作用域中查找"a“。"a“中有一个3,这就是我们要用到的。

一般来说,对于f来说,在执行时使用原始赋值是非常糟糕的。这意味着函数不能利用全局变量的变化。它还需要在定义函数之前分配全局变量,这对于动态语言并不是特别有用。

不过,你可以破解它。如果您使用默认值定义了一个参数,则会在定义函数并获得所需内容时对其进行赋值。

代码语言:javascript
复制
a = 10
def f(x, a=a):
    return x + a
a = 3
print(f(1))
票数 1
EN

Stack Overflow用户

发布于 2021-02-19 04:57:09

你看,在定义 f(x)之前,你已经定义了a。但是您对f(1)的调用是在您将值3赋给"a“之后进行的。

f(x)在被调用时将始终使用"a“的current值,而不是在定义它时。如果您希望f(x)中的"a“为常量值,则应在函数中声明它,如下所示:

代码语言:javascript
复制
def f(x):
    a = 10
    return x + a
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66268016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档