为了账号安全,请及时绑定邮箱和手机立即绑定

Python:保持对函数内变量的更改

Python:保持对函数内变量的更改

阿波罗的战车 2021-08-14 19:40:13
我对 python 中的一个相当简单的任务有疑问,但是,我没有设法找到解决方案。我想为python中已经存在的变量分配一个新值。但是,我对函数内的变量所做的更改并没有坚持该变量。这是我的问题的简化示例:y = 1x = Nonedef test(var):    var = y    return var test(x)print(x)打印只是不返回任何内容。所以我对函数内的变量所做的更改是非永久性的。如何永久更改函数的输入变量?
查看完整描述

2 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

这是按值将变量传递给函数的示例。默认情况下,当您将变量传递给 Python 中的函数时,它是按值传递的。

这意味着,创建了一个具有新作用域的新变量,其值为x。因此,新发生的任何更改x都不会反映到x函数范围之外。

如果您想从函数中取回值,您可以使用 return 语句(如您所用)。return从函数返回值。但是,在您的示例中,没有接收它的变量。因此,它丢失了。

您必须将该函数调用为x = test(x). 这确保x从函数接收值。


查看完整回答
反对 回复 2021-08-14
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

Python 中的变量只是引用对象的名称。在表达式中,名称是实际对象的替代品。Saying 的test(x)意思是“将引用的对象x传入test”。这并不意味着“符号传递x到test”。


此外,重新分配名称只会更改该名称所指的对象。它既不影响对象,也不影响它的任何别名。


总之,var你在里面修改的名字test根本没有关系x。


让函数改变某些东西的首选方法是重新分配结果:


x = 2

def change(var):

    return var * 2


x = change(x)  # x now refers to 4 instead of 2

print(x)

如果要在函数外更改名称,可以使用nonlocalandglobal关键字:


x = 2

def change_x():

    global x

    x = x * 2


change_x()  # x now refers to 4 instead of 2

print(x)

虽然这可以使一些微不足道的问题变得容易解决,但对于较大的程序来说,这通常是一个坏主意。使用全局变量意味着不能再孤立地使用该函数;结果可能取决于调用此类函数的频率和顺序。


如果您有一些自包含的值组和修改它们的方法,则可以使用一个类来描述:


class XY:

    def __init__(self, x, y):

        self.x, self.y = x, y


    def swap(self):

        self.x, self.y = self.y, self.x


my_values = XY(None, 1)

print(my_values.x, my_values.y)

my_values.swap()

print(my_values.x, my_values.y)

与global变量相反,您可以根据需要创建尽可能多的类的隔离实例。每个实例都可以单独处理,而不会影响其他实例。


您还可以使用可变值使更改对外部可见。不是更改名称,而是修改值。


x = [2]  # x is a mutable list, containing the value 2 at the moment

def change(var):

    var[0] = 4  # change leading element of argument


change(x)  # x now contains 4 instead of 2

print(x)


查看完整回答
反对 回复 2021-08-14
  • 2 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信