Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何调用Javascript中的Python函数_Javascript_Python_Variables - Fatal编程技术网

如何调用Javascript中的Python函数

如何调用Javascript中的Python函数,javascript,python,variables,Javascript,Python,Variables,如果我这样做,就可以了: 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

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

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
这不是很简单,所以我是这样做的:

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():
      ^
文件“c.py”,第16行,在
()
文件“c.py”,第13行,a
c=评估(d)
文件“”,第2行
def d():
^
那我该怎么办


感谢分享您可以使用对象的变量。定义将用作数据容器的某个类。

看起来您想将
a
变成一个类:

class A(object):
    b = [1,2,3]
    def d():
        print b

A.d()
A.b = [4, 5, 6]
A.d()

您可能会被javascript的作用域(与python相反)弄糊涂。在继续之前,请阅读官方Python教程中的内容!你可能也会发现Ian Bicking的演讲很有用:。他在研究两种语言之间的差异方面做得很好

在本例中,您尝试使用在另一个函数的命名空间中定义的名称访问对象,这意味着它无法了解该名称。理想的做法是重写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,我只能猜测

但是你为什么不把
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()
或者您正在编写一个包装器,以便在调用每个函数之前始终执行某些操作。在这种情况下,我们可以帮助:

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()

为了修改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
关键字将是另一种(不太可取的)方式。

您想做什么?听起来你在做任何事情,你在做的事情都非常倒退。您有一些代码需要共享一些数据。甚至,您有一些数据需要对其执行某些操作。要是发明了面向对象编程就好了…