回答
让我们用一个简单的例子对于同样的问题:
a = 'something'
def boo():
a = a
boo()
失败的原因是在Python任务,没有伴随global
或nonlocal
声明,表示该分配的名称是本地的当前范围。这不仅发生在函数中,而且发生在类定义中。
这意味着您不能为全局变量和本地变量使用相同的名称并将它们同时使用。您可以使用替代方法从亚伦Digulia的答案,或者使用不同的名称:
def make_class(_a):
class A(object):
a = _a
return A
似乎都工作正常(在Python 2.5,至少):
>>> def make_class(a):
... class A(object):
... _a = a
... return A
...
>>> make_class(10)._a
10
>>> def make_class(b):
... class B(object):
... def get_b(self):
... return b
... return B
...
>>> make_class(10)().get_b()
10
作品就好了:
>>> def make_class(a):
class A(object):
_a=a
return A
>>> make_class('df')
<class '__main__.A'>
>>> make_class('df')._a
'df'
顺便说一句,function
在Python中并不是一个保留关键字。
我的不好。我知道Python,诚实! – joeforker 2009-09-18 15:47:18
@joeforker,所以接受SilentGhost的答案已经! - ) – 2009-09-18 16:49:13
尝试
def make_class(a):
class A(object): pass
A.a=a
return A
错误你得到(NameError: name 'a' is not defined
)是因为在类名a
阴影参数的功能a
;因此在代码中尝试“a = a”时没有定义a
。换句话说,右边a
是不是a
来自def
;相反,Python在类A
中查找它,因为a
已在作业左侧提到。
这变得更加干净,功能:
x = 1
def a(x):
print 'a:',x
x = 3
def b():
print 'b:',x
b()
a(2)
def c():
x = x
显然,第一印刷应打印2,而不是1,所以参数的a
x
绝影全局变量x
。 b
在x
被称为a
的参数的范围内定义,因此打印工作正常。
但是,如果您尝试致电c
,则会得到UnboundLocalError: local variable 'x' referenced before assignment
,因为Python不会自动绑定全局变量。要解决此问题,您必须在分配前添加global x
。
你的情况大致如下:
x = 1
def a(x):
print 'a:',x
x = 3
def b():
x = x
print 'b:',x
b()
a(2)
虽然印刷x
在上面的例子中的工作,任务不工作。这是确保变量不泄漏的安全措施。解决的办法是使用默认参数设置为“复制”变到b
的范围:
x = 1
def a(x):
print 'a:',x
x = 3
def b(x=x):
x = x
print 'b:',x
b()
a(2)
解决你的问题,你需要告诉Python的‘使参数的A
make_class
可见a
’和在尝试分配课程的a
字段之前,您需要这样做。这在Python中是不可能的。如果你可以使a
可见,那么赋值会改变参数,而不是字段,因为Python无法区分这两个。
由于您无法将其显示,因此没有a
可读,因此NameError
。
请参阅here了解Python中名称范围的解释。
-1您将得到该代码的语法错误,因为您打开类A并且不缩进以下行。放入一个缩进的通行线,你会没事的。 – 2009-09-18 16:16:53
糟糕。添加了缺少的“通行证”。 – 2009-09-21 07:09:17
- 1. 为什么我可以在Ruby中为自己分配一个未定义的变量并获得零?
- 2. 为什么我不能将location.hash分配给一个变量?
- 3. C#为什么我不能为自己的类编写自定义的IEnumerator
- 4. 为什么Elixir允许使用未定义变量的闭包?
- 5. 为什么我必须在闭包中定义一个闭包访问变量时声明一个函数?
- 6. 为什么变量有时不分配?
- 7. 为什么get_posts()不能处理自定义分类?在WordPress
- 8. 为什么我不能将一个wordpress函数分配给一个变量?
- 9. 为什么结构类型被定义为自己的名字?
- 10. 为什么我不能将父类分配给子类类型的变量?
- 11. 为什么将一个IIFE分配给一个变量?
- 12. 为什么我不能创建一个自动变量数组?
- 13. 为什么我不能在JavaScript中的函数中分配一个变量?
- 14. 为什么我不能直接分配变量值?
- 15. 为什么我不能在try块中分配对象变量?
- 16. 为什么我不能一个对象在vue.js分配给定义的变量数据?
- 17. 为什么我不能在GHCi中定义一个类型?
- 18. 为什么在此var声明中将此变量分配给自己?
- 19. Javascript:为什么访问闭包变量可能会很慢
- 20. 为什么我们为每个变量分配12个字节?
- 21. 为什么找不到我自己的自定义模块?
- 22. 为什么我不能为LWP :: UserAgent分配一个IP?
- 23. 为什么打开一个不能为零的变量?
- 24. 为什么我不能在代码块中递归地定义一个变量?
- 25. 为什么结构不能包含它自己的实例?
- 26. 为什么分配给变量列表不一致?
- 27. Python:为什么类变量被赋值?
- 28. 为什么分配给Go中的变量有一个等号
- 29. 你为什么要把它分配给另一个变量?
- 30. 为什么不能将这个变量从一个类传递给另一个
我试图做A = A类中,如在默认的函数参数,那是行不通的。 – joeforker 2009-09-18 15:48:51