为什么这个函数需要存储在变量中?

时间:2018-04-12 07:33:13

标签: python variable-assignment

我最初对此代码有疑问,因为我错过了' n ='在最后一行代码中,因此陷入了无限循环。

此时,虽然我明白需要纠正的是什么,但我不明白为什么。为什么不能' collat​​z(n)'是否足以调用该函数并使用n作为其变量?如果有人能用简单的术语解释这个(初学者),我真的很感激。

def collatz(number):
    if number % 2 == 0:
        print (number // 2)
        return number // 2
    elif number % 2 == 1:
        print (3 * number + 1)
        return 3 * number + 1

print ('Please enter a number.')
n = int(input())
while n != 1:
    n = collatz(n)

2 个答案:

答案 0 :(得分:1)

在Python中,函数接受一个或多个参数,返回单个值或对象。大多数情况下,他们不修改他们的参数(实际上你的collatz函数不会尝试修改它的参数。)

例如,此函数接受变量x,并返回x ** 2。

def f(x):
    return x**2

此函数不会修改x,并且返回值不会自动分配给x。自动赋值给x通常是无益的,如果你的函数接受了多个参数 - 哪一个应该得到返回结果,那就不清楚该怎么办?

您可以通过各种方式调用此函数,但如果您想对结果执行某些操作,则必须将其存储到变量中或立即使用它:

y = 2
z = f(y)

z = f(2)

y = 2
print(f(y))

请注意,如果您将函数f视为将其参数转换为其他参数并将其返回的对象,则所有这些都是有意义的,但如果您希望ff(2),则所有这些都没有意义修改其参数(然后CREATE TABLE dbo.randomitems (namesused nvarchar(50)) CREATE TABLE dbo.randomlist (namesused nvarchar(50)) CREATE TABLE dbo.randoms (Names nvarchar(50)) insert into dbo.Randoms (Names) values ('a'), ('u'), ('p'), ('g'), ('j'), ('k'), ('l'), ('t') 必须以某种方式在后续引用期间将数字2转换为平均值4)。

对于它的价值,即使你用函数内部的新值替换其中一个参数,也不会改变函数外部相应变量的值。这是因为函数内的变量只指向对应的值或对象。如果为变量赋值,则函数中的局部变量现在将指向新值,但函数外部的原始变量仍指向旧值。另一方面,您有时可以修改基础值或对象,而不是创建新对象并将局部变量指向它。例如,将项添加到列表或字典将修改基础对象,并且将在您的函数外部显示

但是你的collat​​z函数没有这些 - 它只是计算一个新值并返回它。如果要对该值执行任何操作,则必须显式存储函数调用的结果。它不会自动存储在参数变量中。

答案 1 :(得分:0)

将变量作为参数传递给函数时,变量的副本将发送到函数而不是变量本身。 所以在你的情况下,n_copy(例如)被发送到你的函数而不是n。 现在当你在函数中修改它时它仍然在函数的范围内(只能由函数访问)而不是主程序。 因此,当函数结束时,n没有任何反应,因为修改了n的副本。

现在我们来看看返回功能。由于上述问题,存在返回功能。这将从函数返回一个值到主程序。 在函数中修改n时,需要将修改后的值返回到主程序。 一旦你将它返回到主程序,它必须存储在一个变量中,在你的情况下它是n。

当你开始学习Python时,你应该阅读有关命名空间和范围的内容。 这是谷歌搜索的第一个链接 https://matthew-brett.github.io/teaching/global_scope.html