Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.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
python函数中的全局和局部_Python_Python 3.x - Fatal编程技术网

python函数中的全局和局部

python函数中的全局和局部,python,python-3.x,Python,Python 3.x,我无法理解python中的全局变量和局部变量,尤其是函数。我看了很多例子,但都没有在函数调用中解释清楚。我的示例代码如下: def called(d): del d[0] b=[1] return b def main(): a=[0,1,2,3] print("first ", a) c=called(a) print("second ", a) main() 输出: first [0, 1, 2, 3] second [1,

我无法理解python中的全局变量和局部变量,尤其是函数。我看了很多例子,但都没有在函数调用中解释清楚。我的示例代码如下:

def called(d):
    del d[0]
    b=[1]
    return b

def main():
    a=[0,1,2,3]
    print("first ", a)
    c=called(a)
    print("second ", a)

main()
输出:

first  [0, 1, 2, 3]
second  [1, 2, 3]

我希望“a”在main上是局部变量。当我调用“被调用”函数时,a被复制到d。d是本地的“called”。但现实是不同的。我用一个“称为(a.copy)”来解决这个问题。但我想理解其中的逻辑

Python从不隐式复制任何内容,当您将对象(Python中的所有内容都是对象)传递给函数时,函数中的内容就是您传入的对象,因此,如果您对其进行变异,则会在函数外部看到更改

另外,参数名称是函数的本地名称,因此在函数中重新绑定参数只会更改此名称在函数中指向的对象,而不会影响传递的对象


更深入的解释。

基本上,全局变量是一个可以在任何地方访问的变量,无论它是否在函数中(或任何其他内容)

局部变量是仅存在于相关函数中的变量。您不能在其他任何地方声明或访问它。但是,您可以通过在函数中显式地包含它来使其成为全局的


据我所知,“d”实际上并没有被定义为变量,而是一个函数参数,如
中所示,被称为(d)
。如果您在函数中也将
d[0]
更改为
blablabla[0]
,则可以将其更改为
called(blabla)
,并且您的函数将以同样的方式运行

这意味着,当您调用该函数时,其中包含“d”的任何内容都将替换为您所调用的内容。在本例中,参数已更改为变量a,然后按照您所述执行函数


要定义变量,必须使用“=”。

a
不会复制到
d
。除非您明确告诉列表,否则不会复制列表to@Moberg这不仅适用于列表,而且适用于所有类型。可能重复@Moberg I repeat:这不仅适用于列表,适用于所有类型,包括int。通过检查int的
id()
函数内外,您可以轻松地自己测试它。“据我所知,'d'实际上并没有被定义为变量,但作为函数参数”=>函数参数是局部变量。这是有文档记录的,您可以通过检查函数的
.func\u code.co\u varnames
来自己检查它,总结如下:正如名称没有类型一样,值也没有作用域。当我们说一个函数有一个局部变量时,我们的意思是该名称的作用域是函数:不能在函数外部使用该名称,当函数返回时,该名称将被销毁。但正如我们所看到的,如果名称的值有其他引用,它将继续存在于函数调用之外。这是一个本地名称,而不是本地值。”()谢谢@bruno