【问题标题】:Python. Parameters and returned valuesPython。参数和返回值
【发布时间】:2017-08-29 11:54:14
【问题描述】:

在这个问题上我对 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']

这是我想要的结果。

以下对所发生事情的解释是否正确,这样我在编写函数时会感觉更安全?

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

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

  3. NN 是函数的“本地”变量,但它包含传递变量的指针/地址,并且由于列表是可变的,所以 unsort_letters 的内容在函数内会发生变化?

    李>

这导致我:

  1. 是否存在无法更改函数内传递参数的内容而必须编写类似以下内容的情况?

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

?

【问题讨论】:

  • This example 在文档中很好地解释了这个问题。

标签: python python-3.x parameter-passing


【解决方案1】:

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

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

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

NN = unsort_letters

您传入unsort_letters 作为参数。您将 另一个 名称 (NN) 分配给该参数 - 就是这样,不会复制任何数据。

是否有过无法更改函数内传递参数的内容的情况

是的,当您传入的任何内容都是不可变的时。例如,整数没有更新其值的方法,因此您不能在函数体(或其他任何地方)中对它们进行变异。

需要注意的是,Python 在赋值和参数传递过程中不会以不同的方式处理可变和不可变类型。您根本无法对不可变类型进行变异,因为它们没有变异方法。

【讨论】:

  • 引用“您传入 unsort_letters 作为参数。您为该参数分配了另一个名称 (NN) - 就是这样,没有数据被复制。”这是完全有道理的。感谢 YouTube 链接。
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2010-10-14
  • 2017-07-13
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
相关资源
最近更新 更多