在这个问题中相对较新的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']
然后我调用了函数
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']
我想要的结果是什么。
以下对发生的事情的解释是否正确,以便在编写函数时感觉更安全一点?
unsort_letters,[&#39; q&#39;,&#39; w&#39;&#39; e&#39;,...]的原始值是&#34;全球&#34;
通过调用func_sort_list(unsort_letters)我已将unsort_letters的地址/指针传递给func_sort_list?
NN是一个变量&#34; local&#34;函数,但它包含传递的变量的指针/地址,因为列表是可变的,unsort_letters的内容在函数内被更改?
这导致我:
当我无法在函数中更改传递参数的内容时,是否存在这样的情况?我必须编写如下内容?
def func_return_only(input_parm):
result_var = << some processing on input_parm goes here>>
return (result_var)
我必须按如下方式调用以获取var_s中返回值的值。
var_s = func_return_only(<< my input variable or value>>)
答案 0 :(得分:6)
你的心理模型非常正确。但是,您不应该担心Python是“按值传递”还是“按引用传递”。您必须了解Python中的赋值如何工作。 This是最好的资源。最重要的事实是赋值永远不会复制数据。
一旦理解了赋值,你唯一需要知道的是函数参数是通过赋值传递的。
调用函数时隐式发生的第一件事是
NN = unsort_letters
你传递了unsort_letters
作为参数。您将另一个名称(NN
)分配给该参数 - 就是这样,不会复制任何数据。
当我无法在函数
中更改传递参数的内容时,是否存在这种情况
是的,当你传入的任何内容都是不可变的。例如,整数没有方法来更新它们的值,所以你不能在函数体(或其他任何地方)中改变它们。
然而,重要的是要注意Python在赋值和参数传递期间不会以不同方式处理可变和不可变类型。你根本无法改变不可变类型,因为它们没有变异方法。