首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单的python函数跟踪

简单的python函数跟踪
EN

Stack Overflow用户
提问于 2014-12-07 05:25:09
回答 2查看 65关注 0票数 1

我是python的新手,正在尝试跟踪这个简单的程序。我想提高我查看代码并理解输出结果的能力。

老实说,我刚刚开始准备python入门期末考试,在这门课上遇到了麻烦。如果有人知道他们过去使用过的介绍python的简明资源,那也会很有帮助。

这是程序。

代码语言:javascript
复制
def fun(x):
    x[0] = 0
    x = [4,5,6]
    return x

def main():
    y = [1,2,3]
    z = fun(y)
    print("z =",z)
    print("y =",y)

main()

所以基本上我希望有人解释为什么输出是这样的:

代码语言:javascript
复制
z = [4, 5, 6]
y = [0, 2, 3] 
EN

回答 2

Stack Overflow用户

发布于 2014-12-07 07:57:49

下面是一个简单的示例,您可以添加它来跟踪代码的执行情况:

代码语言:javascript
复制
import sys

def tracer(frame, event, arg):
    print(event, frame.f_lineno, frame.f_locals)
    return tracer

sys.settrace(tracer)

def fun(x):
    x[0] = 0
    x = [4,5,6]
    return x

def main():
    y = [1,2,3]
    z = fun(y)
    print("z =",z)
    print("y =",y)

main()
票数 1
EN

Stack Overflow用户

发布于 2014-12-07 05:39:16

在Python中,列表和对象的赋值更像是绑定。Y不是指1,2,3,但它与之相关。分配给y的其他变量也绑定到列表对象。

因此,代码逐步执行的过程如下所示:

  1. 创建一个列表1,2,3,并将其位置赋给变量y。
  2. 将y传递给fun,因为x引用列表1,2,3的位置。
  3. 集合x,引用1,2,3,为0。因此,1,2,3变成了0,2,3。列表4,5,6的
  4. 集合x不再引用0,2,3,而是新的列表对象4,5,6。
  5. 将x传回变量z。z现在引用4,5,6的位置。

如果您不想修改另一个函数中的列表或对象,可以使用copy()和deepcopy()方法来创建新对象。即

代码语言:javascript
复制
fun( y )            # passes [1,2,3] into fun()
fun( y.copy() )     # passes a copy of [1,2,3] into fun()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27336715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档