蟒蛇.参数和返回值

Cli*_*ong 7 python parameter-passing python-3.x

在这个问题上相对较新的Python,我可能会使用一些不正确的术语,并会显示出误解 - 这就是我在这里的原因.

我正在研究Python函数,并试图确保我理解变量的传递和返回方式.

我已经写了这个简单的函数来对列表中的项进行排序

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

    NN.sort()
    print (NN)

    return (w)
Run Code Online (Sandbox Code Playgroud)

我已将值分配给列表

unsort_letters=['q','w','e','r','t','y']
Run Code Online (Sandbox Code Playgroud)

然后我调用了这个功能

func_sort_list(unsort_letters)
Run Code Online (Sandbox Code Playgroud)

并得到结果

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'
Run Code Online (Sandbox Code Playgroud)

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

unsort_letters
['e', 'q', 'r', 't', 'w', 'y']
Run Code Online (Sandbox Code Playgroud)

这是我想要的结果.

以下是对正确发生的事情的解释,以便在编写函数时能够感觉更安全吗?

  1. unsort_letters的原始值['q','w','e',...]是"全局的"?

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

  3. NN是函数的一个变量"local",但它包含传递变量的指针/地址,因为列表是可变的,unsort_letters的内容在函数内被更改?

这导致我:

  1. 当我无法在函数中更改传递参数的内容时,是否存在这样的情况,我必须编写如下内容?

    def func_return_only(input_parm):
        result_var = << some processing on input_parm goes here>>
    
    return (result_var)
    
    Run Code Online (Sandbox Code Playgroud)

我必须按如下方式调用以获取var_s中返回值的值.

var_s = func_return_only(<< my input variable or value>>)
Run Code Online (Sandbox Code Playgroud)

tim*_*geb 6

你的心理模型非常正确.但是,您不应该担心Python是"按值传递"还是"按引用传递".您必须了解Python中的赋值如何工作.是最好的资源.最重要的事实是,分配永远不会复制数据.

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

当你调用你的函数时,第一件事是隐式发生的

NN = unsort_letters
Run Code Online (Sandbox Code Playgroud)

unsort_letters作为参数传入.您为该参数指定了另一个名称(NN) - 就是这样,没有数据被复制.

当我无法在函数中更改传递参数的内容时,是否存在这种情况

是的,当你传入的任何内容都是不可改变的.例如,整数没有方法来更新它们的值,因此你不能在函数体(或其他任何地方)中改变它们.

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

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