如果我这样做,那就没关系了:
def a():
b = [1,2,3]
def d():
print b
d()
a()
但我有很多方法需要函数 d ,所以我必须从函数 a 中定义它,但它显示错误:
def d():
print b
def a():
b = [1,2,3]
d()
a()
错误:
File "c.py", line 21, in <module>
a()
File "c.py", line 19, in a
d()
File "c.py", line 16, in d
print b
NameError: global name 'b' is not defined
所以我有很多不同的变量,比如b在不同的函数中,所以我不想像这样发送变量:
def d(b1,b2,b3,b4,b5):
print b1,b2,b3,b4,b5
这不是很简单,所以我这样做:
d = \
'''
def d():\n
print b
'''
def a():
b = [1,2,3]
c = eval(d)
c()
a()
但它也显示错误:
File "c.py", line 16, in <module>
a()
File "c.py", line 13, in a
c = eval(d)
File "<string>", line 2
def d():
^
所以我该怎么做,
感谢
答案 0 :(得分:4)
你可能会对javascript的范围感到困惑,这与python的相反。在进一步了解之前,请阅读官方Python教程对scopes and namespaces所说的内容!您可能也会发现Ian Bicking的这篇演讲很有用:Javascript for People Who Know Python。他很好地解决了两种语言之间的差异。
在这种情况下,您尝试访问具有在另一个函数的命名空间中定义的名称的对象,这意味着它无法知道它。理想的做法是重写d(),因此它接受一个参数并传递给它b。你也可以使用global
将b声明为全局,但你应该避免这种情况。
def d():
print b # b is defined in a so it's only available in a's local namespace
def a():
b = [1,2,3]
d() # if you rewrite d to accept an argument, you can pass it b and this will work
这样做:
def d(b): # accepts an argument now
print b
def a():
b = [1,2,3]
d(b) # calls d with an argument of b
如果您对各种范围内的名称感到好奇,可以这样做:
import __builtin__
def d():
print dir(__builtin__) # built-in names
print dir(globals()) # global names
print dir(locals()) # local names, defined in d
我认为你会发现Python的命名空间/范围是相当直观的。
答案 1 :(得分:3)
看起来你想把a
变成一个类:
class A(object):
b = [1,2,3]
def d():
print b
A.d()
A.b = [4, 5, 6]
A.d()
答案 2 :(得分:1)
要共享变量,您可以使用对象。定义一些您将用作数据容器的类。
答案 3 :(得分:0)
如果没有看到您尝试模拟的JavaScript,我只能猜测。
但为什么不把b
传递给d
:
def d(b):
print b
def a():
b = [1,2,3]
d(b)
a()
或者,如果这不是一个选项,也许您可以将b
声明为全球:
b = []
def d():
print b
def a():
global b
b = [1,2,3]
d()
a()
或者你可能正在编写一个包装器来在调用每个函数之前总是先做一些事情。在这种情况下,decorators可以提供帮助:
def test(b):
def t(f):
def d():
print b
return f(b)
return d
return t
@test([1,2,3])
def a(b):
pass
a()
答案 4 :(得分:0)
只是为了修改Mikel和zeekay现有的好答案,这里是JavaScript的不同之处。你可能拥有的是:
function d() {
print(b);
}
function a() {
b = [1,2,3];
d();
}
但是你在Python中获得的东西相当于:
function d() {
print(b);
}
function a() {
var b = [1,2,3];
d();
}
(请注意第二版中的var b
)。如果您了解JavaScript,您将获得不同。正如所建议的那样,论证传递是更好的方式。使用global
关键词将是另一种(不太可取的)方式。