【问题标题】:Would scope would this variable(s) belong to?这个变量属于范围吗?
【发布时间】:2022-08-11 20:08:18
【问题描述】:
class Something:
    x = \"hi\"
    def func(self):
        k = \"hi2\"

在这段代码中,x 作为 class attributek 作为变量。 x 属于什么范围(localenclosedglobalbuiltin),k 属于什么范围?

  • 这种措辞听起来有点像家庭作业(为什么应该是builtin?)。你试过用 Python 研究作用域吗?大多数教程都有关于这些的部分。
  • 刚刚修复了缩进。这不是作业,我知道答案不是built inglobal 范围,我只是把它放在那里,这样我就可以得到一个答案来回答变量属于哪个范围类别,而不是类似:这个变量属于这个函数范围等
  • 不在func() 之内,而是在课堂之外

标签: python python-3.x oop scope


【解决方案1】:

您说您不想要“在函数范围内”或“--类”之类的答案,但这将是最准确的答案。像local 这样的范围始终与您所在的位置相关。

如果您在全局范围内,那么只有类本身同时在 localglobal 范围内(当时相同),但两个变量都不在。您可以通过类访问x,但k 只会在调用函数时定义。

如果您在func 内,则kselflocal 范围内,但x 既不在local 范围内,也不在global 范围内。它也不在封闭的范围内;它不能直接访问,如print(x),只能通过实例self 或类Something

class Something:
    x = "hi"
    def func(self):
        k = "hi2"
        print(locals())    # contains k, self
        print(globals())   # contains Something
        print(k)           # works
        print(self.x)      # works
        print(Something.x) # works
        print(x)           # does not work

Something().func()

嵌套函数的情况不同。在这里,外部函数中定义的变量在“封闭范围”中,但可以通过使用它们提升到本地范围:

def f():
    a = []
    def g():
        b = None
        # a = []   # define a new a in local scope?
        # a.append(42)  # without above line, this changes enclosed a
        print(locals())  # only b, unless you use a here
    g()
    print(a)
f()
  • 如果您将注释行保留原样,则内部本地范围内只有b
  • 如果您激活append 行,a 从封闭范围移动到本地范围并在两个范围内更改
  • 如果激活两个注释行,则在本地范围内定义一个新的a,而不更改封闭范围内的a

【讨论】:

  • “但是 x 既不在本地范围内也不在全局范围内。它也不在封闭范围内”,因此如果变量像在类中那样声明(作为类属性意味着在任何方法之外),它就不属于任何范围除了那个类)?
  • @DavidKolesanov 我想这是一个解释问题。类在全局范围内,实例在本地范围内,您可以通过其中任何一个访问x。但是你不能像最后一行那样只使用x。使用封闭范围(如嵌套函数)是可能的。
【解决方案2】:
class Something:
  x = "hi" # this is enclosed
  def func(self):
      k = "hi2" # this is local

print(x) #returns a NameError
print(Something.x)
print(k) #returns a NameError
print(Something.func('k')) #returns None because there is no print(k)

如果要访问 k:

class Something:
  x = "hi"
  def func():
      Something.func.k = "hi2"

Something.func()
print(Something.func.k)

【讨论】:

  • 我在某处读过属于封闭范围的变量在嵌套函数中声明...
猜你喜欢
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
相关资源
最近更新 更多