如果我这样做,那就可以了:

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/

10-12 00:42
查看更多