python function variable scope
在运行下面的函数之前,l1是一个空列表,但是为什么在运行函数之后是[1,2,3]呢?
1 2 3 4 5 6 7 8 9 10 11
| 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] |
- 因为这就是你写函数要做的?它将来自lsource的数据复制到ldest中,然后复制到l1中。
- 因为功能正常工作。你在期待什么?
- 我希望在运行代码之后,copylist(l2,l1)显示ldest[1,2,3]和l1,[]。那为什么呢?
- 我投反对票是因为根据对答案的评论,这个问题比你在上面发表的更多。如果你想要一个完整的答案,你需要给出一个完整的问题。
- 这似乎是一个关于范围的问题。如果将整数字符串等作为参数传递给函数,则它只有局部作用域(除非由全局/非局部调用,否则根本不存在于函数内部,对吗?)那么,为什么列表、字典等在函数内部具有全局/非本地作用域呢?我想是因为易变性?stackoverflow.com/questions/23029727/…
似乎您希望列表的处理方式与传递值类似,因为它可能使用其他语言。python参数更像是按引用传递,由于列表是可变的,所以它完全按照您的要求执行。
对python越熟悉,它就越明显、自然,甚至更方便。
什么是ldest?这是你传进来的东西。在这种情况下,您通过了l1。ldest和l1是同一个列表。因此,使用什么名称来引用对象并不重要。
- 那么为什么在函数调用后打印cat不在代码链接中显示bing tiddletddle bang?
- 你为什么要这样?您将cat指定为part1 + part2,此时它不再引用传入的值。您没有在您所讨论的代码中重新分配任何内容(ldest在整个函数中引用相同的内容)。
对于lsource的每个元素,如果它存在于ldest中,那么它将被附加到ldest中。因此,l2的所有元素都复制到(而不是移动到)l1。
python通过引用传递对象。这意味着您将元素添加到传递的实际对象中。
- 那么为什么在函数调用后打印cat不在代码链接中显示bing tiddletddle bang?
- @米凯西拉,为什么不把链接中的代码复制粘贴到你的问题中,而不是让其他人去寻找它呢?
- @Mikesila是因为代码链接内的cat定义了一个新变量,该变量仅在函数内可见。+操作创建一个新列表,其中包含两个参数的内容副本,并将其分配给cat。