【问题标题】:Do Python functions modify their arguments?Python 函数会修改它们的参数吗?
【发布时间】:2014-10-09 21:35:43
【问题描述】:

我今天在计算机科学课上,老师在黑板上放了一段 python 编码,说他不知道为什么它不起作用。他在向我们展示功能并说:

def app(x):
    x.append(" ")
    print(x)

def ext(x,y):
    x.extend(y)
    print(y)

nums = [1,2,3,4,5,6]
numbers = [7,8,9,10]

app(nums)
ext(nums,numbers)

print("End of program")

这段代码是为了展示你不打字时的表现

return x

在函数中,当您返回主程序时,变量不会改变,但是当他运行程序时,第一个函数添加了空格并在返回时将其保留在那里,导致打印以下文本...

['1','2','3','4','5','6',' ']
['1','2','3','4','5','6',' ','7','8','9','10']
End of program

请帮帮我。

【问题讨论】:

  • 问题到底是什么?
  • 您正在操作numsx 引用的对象。您没有在操纵 x 所指的内容。如果引用是您的手指指向月亮(而不是月亮本身),那么您并没有改变手指指向的内容,而是实际上跟随手指并在月球上插了一面旗帜。
  • 你需要一个更好的老师...对象和对该对象的引用(实际上是本示例中传递的内容)之间的区别非常非常基本。
  • 两者都没有,它正在做它应该做的事情。实际上,当参数就地更改时,Python 约定 notreturn
  • @DragonstoneJosh:代码没有问题。如果你的老师不明白发生了什么,你需要一个更好的老师。

标签: python list function


【解决方案1】:

你说的重点是要证明一个列表不会被改变,除非它被返回。那是错误的。该列表是一个可变对象。当您将它(按名称)传递给函数并对其进行更改时,它将被更改。如果您不想更改,则需要使用副本。

【讨论】:

  • +1 用于识别其中的问题并解释可变对象
  • 虽然,我要指出这是通过“引用”而不是“按名称”传递。您可能应该编辑您的答案以包含该更改。
  • 这不是通过引用传递的。 “通过引用传递”是一种技术,其中函数中的参数是对调用者中名称的引用。这在 Python 中是不可能的。但你说得对,它也不是“名传”! Python 的最佳术语是“通过共享传递”。
  • 最佳术语仍有争议,但可能是 pass by assignment按对象引用的名称传递,似乎 按名称传递一个适当的速记(在 Algol 的上下文之外)。但我不是 CS 类型的,所以请随时纠正这种印象。
【解决方案2】:
def app(x):
    return x + [" "]


def ext(x,y):
    return x + y

可能是你想要做的......我不确定,这不会改变任何一个原始列表,但会返回一个新列表作为结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2011-09-08
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多