当前位置: 首页 > 面试题库 >

在Python中禁用全局变量查找

张建华
2023-03-14
问题内容

简而言之,问题 有没有一种方法可以防止Python在当前作用域之外查找变量?

细节:

如果在当前作用域中未定义变量定义,Python将在外部作用域中查找它们。因此,这样的代码在重构过程中如果不小心,很容易中断:

def line(x, a, b):
    return a + x * b

a, b = 1, 1
y1 = line(1, a, b)
y2 = line(1, 2, 3)

如果我重命名了函数参数,但忘了在函数体内重命名它们,代码仍将运行:

def line(x, a0, b0):
    return a + x * b  # not an error

a, b = 1, 1
y1 = line(1, a, b)  # correct result by coincidence
y2 = line(1, 2, 3)  # wrong result

我知道从外部范围中隐藏名称是一种不好的做法。但是,无论如何都有一些原因:

  • 有时使用相同的名称可能很有意义,因为它们指的是相同的事物
  • 一个可能用尽了有意义的变量名
  • 懒惰

有没有一种方法可以防止Python在当前范围之外查找变量?(因此,在第二个示例中访问ab引发错误。)

由于懒惰,我希望解决方案无需重复的样板代码即可:)

如果问题在Python版本方面不明确,我对Python 3.3及更高版本非常感兴趣。


问题答案:

不,您不能告诉Python不要在全局范围内查找名称。

如果可以,将无法使用模块中定义的 任何
其他类或函数,也不能使用从其他模块导入的对象,也不能使用内置名称。您的函数名称空间几乎没有它需要的所有内容,而唯一的出路就是将所有内容导入本地名称空间。
对于模块中的每个功能

不要试图破坏全局查找,而要保持全局名称空间整洁。不要添加不需要与模块中其他作用域共享的全局变量。main()例如,使用一个函数来封装实际上只是局部变量的东西。

另外,添加单元测试。没有(甚至只有几个)测试的重构总是容易产生错误。



 类似资料:
  • 问题内容: 我了解Python中局部变量和全局变量的概念,但是我只是有一个问题,为什么下面的代码中会出现错误?Python逐行执行代码,因此在读取第5行之前,它不知道a是局部变量。Python尝试执行第5行后,会回退一行并将其标记为错误吗? 问题答案: 设置和测试 为了分析您的问题,让我们创建两个独立的测试函数来复制您的问题: 版画。因此,调用此函数不是问题,而是在下一个函数上: 我们收到一个错误

  • 问题内容: 此代码为何起作用: 但这给出了“分配前引用的局部变量’var’”错误: 问题答案: 因为在第一个代码中,您已经创建了一个局部变量并使用了它的值,而在第二个代码中,您正在使用局部变量,而没有对其进行定义。 因此,如果要使第二个功能正常工作,则需要声明:- 在使用该功能之前。 而在此代码中: 更新 :- 但是,按照@Tim的注释,您不应在函数内部使用变量。最好在使用变量之前先定义变量,然后

  • 主要内容:Python局部变量,Python全局变量,获取指定作用域范围中的变量所谓 作用域(Scope),就是变量的有效范围,就是变量可以在哪个范围以内使用。有些变量可以在整段代码的任意位置使用,有些变量只能在函数内部使用,有些变量只能在 for 循环内部使用。 变量的作用域由变量的定义位置决定,在不同位置定义的变量,它的作用域是不一样的。本节我们只讲解两种变量, 局部变量和 全局变量。 Python局部变量 在函数内部定义的变量,它的作用域也仅限于函数内部,出了函数就不能

  • 问题内容: 我正在尝试使用exec运行一段python代码。 这导致以下输出 但是,如果我将代码更改为此- 然后工作正常-提供以下输出- 显然,A存在并且可以访问-在第一段代码中出了什么问题?我正在使用2.6.5,欢呼声, 科林 更新1 如果我检查类中的locals()- 然后很明显,locals()在两个地方都不相同- 但是,如果我这样做,就没有问题- 更新2 好的,所以这里的文档-http:

  • 问题内容: 如何在函数中创建或使用全局变量? 如果在一个函数中创建全局变量,如何在另一个函数中使用该全局变量?我是否需要将全局变量存储在需要对其进行访问的函数的局部变量中? 问题答案: 你可以在其他函数中使用全局变量,方法是像在分配给它的每个函数中一样声明它: 我想这是因为全局变量是如此危险,因此Python希望通过显式要求使用关键字来确保您真正知道这就是要使用的内容。

  • 问题内容: 我正在Django中寻找一种简单但推荐的方式,将变量仅存储在内存中。当Apache重新启动或Django开发服务器重新启动时,该变量重置为0。更具体地说,我想计算在每个模型实例(数据库记录)上执行特定操作的次数,但是出于性能原因,我不这样做想要将这些计数存储在数据库中。我不在乎服务器重启后计数是否消失。但是,只要服务器启动,我就希望这些计数在Django Shell和Web界面之间保持