Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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_List_Function_Scope_Append - Fatal编程技术网

python函数变量范围

python函数变量范围,python,list,function,scope,append,Python,List,Function,Scope,Append,在运行下面的函数之前,l1是一个空列表,但为什么在运行函数之后它是[1,2,3] def copylist(lsource, ldest): for e in lsource: ldest.append(e) print 'ldest =',ldest l1 = [] l2 = [1, 2, 3] copylist(l2, l1) print l1 # displays [1, 2, 3] print l2 # displays [1, 2, 3]

在运行下面的函数之前,l1是一个空列表,但为什么在运行函数之后它是[1,2,3]

def copylist(lsource, ldest):
    for e in lsource:
        ldest.append(e)
    print 'ldest =',ldest


l1 = []
l2 = [1, 2, 3]
copylist(l2, l1)
print l1  # displays [1, 2, 3]
print l2  # displays [1, 2, 3]  

您似乎期望列表像其他语言中的传递值一样进行处理。Python参数更像是通过引用传递的,因为列表是可变的,所以它完全按照您的要求执行


您对Python越熟悉,这看起来就越明显、自然甚至方便。

Python通过引用传递对象。这意味着您将元素添加到您传递的实际对象中。

对于lsource的每个元素,如果它存在于ldest中,那么它将被追加到ldest中。因此,l2的所有元素都复制到(而不是移动到)l1

什么是测试?不管你说了什么。在本例中,您传入了
l1
ldest
l1
是相同的列表。因此,您使用什么名称来引用对象并不重要。

因为这就是您编写函数的目的?它将数据从
lsource
复制到
ldest
,因此它将数据复制到
l1
。因为该函数工作正常。你期望什么?我期望copylist(l2,l1)在运行代码后显示ldest[1,2,3]和l1,[]。那为什么呢?我投了反对票,因为根据对答案的评论,这个问题比你在上面发表的内容还要多。如果你想要一个完整的答案,你需要给出一个完整的问题。这似乎是一个关于范围的问题。如果作为参数传递给函数,则整数字符串等仅具有局部作用域(除非由全局/非局部调用,否则函数内部根本不存在,对不对?)。那么,为什么列表、字典等在函数中具有全局/非局部作用域呢?我猜这是因为可变性?那么,为什么函数调用后打印cat在代码@MikeSila中不显示Bing tiddle tiddle bang?为什么不将链接中的代码复制并粘贴到您的问题中,而不是让其他人查找它?@MikeSila,因为代码链接中的
cat
定义了一个新变量,该变量仅在函数中可见。
+
操作将创建一个新列表,其中包含两个参数的内容副本,并将其分配给
cat
。那么为什么函数调用后打印cat不会在代码中显示Bing tiddle tiddle bang呢?为什么您希望它显示?您正在将
cat
赋值为
part1+part2
,此时它不再引用传入的值。您没有在问题中重新分配代码中的任何内容(
ldest
在整个函数中引用相同的内容)。