python中方法内类的变量范围

python中方法内类的变量范围,python,inheritance,scope,Python,Inheritance,Scope,我无法理解几个变量的作用域,以及为什么python在一个由方法定义的类中尝试做一些事情时抛出错误 让我从一个有效的基本示例开始,然后再看几个有效和无效的示例。我知道什么是有效的,有时是无效的。但我觉得我对这种情况下的范围(方法中的类)缺乏了解 首先是一个有效的例子 案例1: def foo_method(a, b, c): return b, c, a def bar_method(a=1, b=2, c=3): class BarClass: a_ = a

我无法理解几个变量的作用域,以及为什么python在一个由方法定义的类中尝试做一些事情时抛出错误

让我从一个有效的基本示例开始,然后再看几个有效和无效的示例。我知道什么是有效的,有时是无效的。但我觉得我对这种情况下的范围(方法中的类)缺乏了解

首先是一个有效的例子

案例1:

def foo_method(a, b, c):
    return b, c, a

def bar_method(a=1, b=2, c=3):
    class BarClass:

        a_ = a + 1
        b_ = b + 1
        c_ = c + 1

        b_, c_, a_ = foo_method(a, b, c)

    return BarClass()
def foo_method(a, b, c):
    return b, c, a

def bar_method(a=1, b=2, c=3):
    class BarClass:

        a_ = a + 1
        b_ = b + 1
        c_ = c + 1

        b, c, a = foo_method(a, b, c)

    return BarClass()
def foo_method(a, b, c):
    return b, c, a

def bar_method(a=1, b=2, c=3):
    class BarClass:

        a = a + 1
        b = b + 1
        c = c + 1

    return BarClass()
当我试着运行上面的代码时,它是有效的
temp=bar\u method()
可以解决任何问题

案例2:

def foo_method(a, b, c):
    return b, c, a

def bar_method(a=1, b=2, c=3):
    class BarClass:

        a_ = a + 1
        b_ = b + 1
        c_ = c + 1

        b_, c_, a_ = foo_method(a, b, c)

    return BarClass()
def foo_method(a, b, c):
    return b, c, a

def bar_method(a=1, b=2, c=3):
    class BarClass:

        a_ = a + 1
        b_ = b + 1
        c_ = c + 1

        b, c, a = foo_method(a, b, c)

    return BarClass()
def foo_method(a, b, c):
    return b, c, a

def bar_method(a=1, b=2, c=3):
    class BarClass:

        a = a + 1
        b = b + 1
        c = c + 1

    return BarClass()
案例2不起作用,即
temp=bar\u method()
抛出错误
name错误:未定义名称“a”

案例3:

def foo_method(a, b, c):
    return b, c, a

def bar_method(a=1, b=2, c=3):
    class BarClass:

        a_ = a + 1
        b_ = b + 1
        c_ = c + 1

        b_, c_, a_ = foo_method(a, b, c)

    return BarClass()
def foo_method(a, b, c):
    return b, c, a

def bar_method(a=1, b=2, c=3):
    class BarClass:

        a_ = a + 1
        b_ = b + 1
        c_ = c + 1

        b, c, a = foo_method(a, b, c)

    return BarClass()
def foo_method(a, b, c):
    return b, c, a

def bar_method(a=1, b=2, c=3):
    class BarClass:

        a = a + 1
        b = b + 1
        c = c + 1

    return BarClass()
案例3不起作用,即
temp=bar\u method()
抛出错误
name错误:未定义名称“a”

案例4

def foo_method(a, b, c):
    return b, c, a

def bar_method(a=1, b=2, c=3):
    class BarClass:

        a_ = a + 1
        b_ = b + 1
        c_ = c + 1

        a_ = a_ + 1

        b_, c_, a_ = foo_method(a_, b_, c_)

    return BarClass()
案例4有效


我弄不明白为什么某些操作有效而其他操作无效。有谁能解释一下我在这里不能理解的东西吗。似乎我无法对
bar\u方法中定义的变量进行任何修改

类中的赋值:

#case 2
b, c, a = ...

#case 3
a = ...
b = ...
c = ...
使这些名称成为类作用域的本地名称,以便将赋值右侧的名称解释为本地作用域名称。尚未进行评估。
(这可能说得不好,请随意改进措辞)




发件人:
4.1. 程序结构

Python程序由代码块构造而成。积木就是一块 作为一个单元执行的Python程序文本。以下是 块:模块、函数体和类定义

4.2.1名称绑定通过代码块内的赋值讨论名称绑定

在4.2.2中。姓名决议第4段规定:

如果名称绑定操作发生在代码块中的任何位置,则所有 块中名称的使用被视为对 当前块

我还找不到引用,但名称绑定发生在求值之前。
(我的假设——也许有人会澄清)


编程常见问题解答中的最后一个(?)

谢谢您的链接。问题似乎相似。我看不到对它的解释,不能在该线程中修改。请注意,您可以精简示例,因为
b
c
是多余的。另请注意,在案例1中,
a_
b_
c_
会立即被覆盖。哦,等等,对不起,您不想修改非局部变量,只需访问它们即可。我将删除重复的标志。非常有趣。我学习变量赋值的方法是python计算右边的部分,然后赋值给右边的变量left@RTM查看我的编辑