简单的python函数跟踪

时间:2014-12-06 21:25:09

标签: python

我对python很新,我正试图追踪这个简单的程序。我希望提高我查看代码和理解输出的能力。

说实话,我刚刚开始学习蟒蛇入门考试并且在课程中遇到麻烦。如果有人知道他们在过去使用的介绍python的任何好的简明资源也会有很大的帮助。

这是该计划。

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

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

z = [4, 5, 6]
y = [0, 2, 3] 

2 个答案:

答案 0 :(得分:1)

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

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 :(得分:0)

考虑在Python中分配列表和对象更像是绑定。你没有提到[1,2,3],但是它已经被它约束了。分配给y的其他变量也绑定到列表对象。

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

  1. 创建列表[1,2,3]并将其位置分配给变量y。
  2. 将y传递给有趣的x。 x指的是列表的位置[1,2,3]。
  3. 将参考[1,2,3] [0]的x [0]设为0.因此,[1,2,3]变为[0,2,3]。
  4. 将x设置为列表[4,5,6]。 x不再引用[0,2,3],而是引用[4,5,6],一个新的列表对象。
  5. 将x传递回变量z。 z现在指的是[4,5,6]。
  6. 的位置

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

    fun( y )            # passes [1,2,3] into fun()
    fun( y.copy() )     # passes a copy of [1,2,3] into fun()