2017-04-04 121 views
7

在这个问题中,对于Python来说比较新,我可能会使用一些不正确的术语,并会显示误解 - 这是我为什么在这里。Python。参数和返回值

我正在学习Python函数,并试图确保我理解变量是如何传递和返回的。

我写了这个平凡函数在

def func_sort_list(NN): 
    for w in NN: 
     print (w, type(w)) 

    NN.sort() 
    print (NN) 

    return (w) 

我已经赋值给一个列表

unsort_letters=['q','w','e','r','t','y'] 

然后我envoke功能

func_sort_list(unsort_letters) 

和列表中的项目进行排序得到结果

q <class 'str'> 
w <class 'str'> 
e <class 'str'> 
r <class 'str'> 
t <class 'str'> 
y <class 'str'> 
['e', 'q', 'r', 't', 'w', 'y'] 
'y' 

然后,执行后,如果我显示我最初传递给函数的变量的内容,我得到

unsort_letters 
['e', 'q', 'r', 't', 'w', 'y'] 

这是我想要的结果。

以下是关于发生了什么事的解释正确,所以在编写函数时我可以感觉更安全一些?

  1. unsort_letters,['q','w','e',...]的原始值是“global”吗?

  2. 通过调用func_sort_list(unsort_letters)我已经将unsort_letters的地址/指针传递给func_sort_list?

  3. NN是函数的变量“local”,但它包含指向传入变量的指针/地址,并且由于列表可变,函数内的unsort_letters的内容将被更改?

这使我:

  • 是否有过当我不能改变函数内传递的参数的内容的情况下,我必须写的东西如下所示?

    def func_return_only(input_parm): 
        result_var = << some processing on input_parm goes here>> 
    
    return (result_var) 
    
  • 这我倒要envoke如下得到在var_s返回值的值。

    var_s = func_return_only(<< my input variable or value>>) 
    

    +0

    [本示例](http://stackoverflow.com/documentation/python/228/functions/2920/argument-passing-and-mutability)在文档中很好地解释了这个问题。 – user2314737

    +0

    感谢您的链接。赞赏。 –

    回答

    6

    你的心智模式非常正确。但是,您不应该担心Python是“按值传递”还是“按引用传递”。您必须了解Python中的赋值如何工作。 This是最好的资源。要知道的最重要的事实是,分配从不复制数据

    一旦你理解了赋值,你唯一需要知道的就是函数参数是通过赋值传递的。

    当你调用你的函数是

    NN = unsort_letters 
    

    您在unsort_letters传递作为参数出现这种情况隐含的第一件事。您将另一个名称(NN)分配给该参数 - 就是这样,没有数据被复制。

    是否有过当的时候无论你传递是不可改变的,我不能改变功能

    是,内传递的参数的内容的情况。例如,整数没有方法来更新它们的值,所以你不能在函数体(或其他地方)中对它们进行变异。

    然而,重要的是要注意,Python在赋值和参数传递期间不会以不同方式处理可变类型和不可变类型。你不能改变不可变类型,因为它们没有变异方法。

    +2

    引用“你传入unsort_letters作为参数,你为该参数指定了另一个名称(NN) - 就是这样,没有数据被复制。”这是完全合理的。感谢您的YouTube链接。 –

    +0

    @CliveLong没问题,谢谢你的好问题。 – timgeb