如果我这样做,那就可以了:
def a():
b = [1,2,3]
def d():
print b
d()
a()
但是我有很多方法需要函数 d ,因此我必须从函数和定义它,但是它显示错误:
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():
^
那我该怎么办,
谢谢
最佳答案
您可能对javascript的作用域感到困惑,这与python的作用域相反。在继续之前,请阅读有关scopes and namespaces的官方Python教程怎么说!您可能还会发现Ian Bicking的这篇演讲很有用:Javascript for People Who Know Python。他出色地完成了两种语言之间的差异。
在这种情况下,您尝试使用在另一个函数的 namespace 中定义的名称访问对象,这意味着它无法了解它。理想的操作是重写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的命名空间/作用域非常直观。
关于javascript - 如何像Javascript一样调用Python函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5919642/