python中方法内类的变量范围
我无法理解几个变量的作用域,以及为什么python在一个由方法定义的类中尝试做一些事情时抛出错误 让我从一个有效的基本示例开始,然后再看几个有效和无效的示例。我知道什么是有效的,有时是无效的。但我觉得我对这种情况下的范围(方法中的类)缺乏了解 首先是一个有效的例子 案例1: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
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查看我的编辑