python中变量作用域的推荐方法

2024-04-26 14:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

在C和变体中,当您有以下内容时:

{
  tmp1 <- 5
  tmp2 <- 2
  print(tmp1 + tmp2)
}

将打印一个7,但是一旦作用域}结束,tmp1tmp2变量将从堆栈中删除。有时我希望python中有类似的功能,这样我就不必在某个时间点之后清理(许多)临时变量。你知道吗

在R中,人们可以使用local({insert piece of code})来实现这个目的。你知道吗

如何在python中获得类似但可读的行为?你知道吗


Tags: of目的功能piece堆栈local时间code
3条回答

实际上,您可以实现一些很难模拟的东西。你知道吗

import inspect
from contextlib import contextmanager


@contextmanager
def Local():
    enter_locals = set(inspect.currentframe().f_back.f_back.f_locals.keys())
    yield
    exit_locals = set(inspect.currentframe().f_back.f_back.f_locals.keys())
    substract = exit_locals - enter_locals
    for variable in substract:
        del inspect.currentframe().f_back.f_back.f_locals[variable]

with Local():
    a = 1
    b = 2
    print(a + b)

print(a + b)

# 3
# ...
# ----> 6 print(a + b)
#
# NameError: name 'a' is not defined

但确实不推荐。为什么要用Python模拟其他语言?Python就是Python,没有块作用域,就是没有块作用域。你知道吗

没有任何特殊的语法,但是您可以通过手动删除变量来实现:

tmp1 = 5
tmp2 = 2

print(tmp1 + tmp2)

del tmp1
del tmp2

如果您不喜欢这种语法,可以使用:

def local(f): 
  f()

@local
def block(): 
  tmp1 = 5
  tmp2 = 2
  print(tmp1 + tmp2)

这基本上与:

def block(): 
   ...
local(block)

https://hackernoon.com/decorators-in-python-8fd0dce93c08

但这一点真的很不明智。你知道吗

请参见https://stackoverflow.com/a/292502/51685,了解Python的变量作用域规则。你知道吗

退出作用域的变量将被自动清除,但您也可以使用del关键字删除对它们的引用。你知道吗

very_large_data = 'x' * 1_000_000_000  # a gigabyte of x!
# do things...
del very_large_data  # that gigabyte will be garbage-collected soon after

如果您担心“范围污染”会使调试等变得更容易,只需将代码重构成更小的函数和/或类(这样您就可以将共享状态存储在self.

相关问题 更多 >