0

可能重复:
Python - 传递值如何工作?

如果我有一个变量并将其实例化为 None,我该如何进行一个反映多个范围内变化的赋值?

例如:

def doStuff(test):
    test = "hello world"

def main():
    test = None
    doStuff(test)
    print(test)

如果我猜对了,那么输出什么都不是,因为“测试”是按值传递的?有没有办法让它通过引用传递而不在函数之前静态声明类型?

4

4 回答 4

2

当你这样做时:

def main():
    test = None
    doStuff(test)
    print(test)

您本质上打印' 范围内的字符串对象(由test引用引用) 。main()对于由 中的变量print引用的内部字符串对象,您应该执行以下三个操作之一:testdoStuff

  • 你应该在里面使用一个print语句doStuff

  • 或使用global关键字

  • doStuff从您存储在main()'s中的值返回一个值test

对于最后一部分,您可以在此处找到更多信息。

于 2013-01-09T23:12:52.537 回答
0

您可以查看global关键字。

def doStuff():
    global test
    test = 'Hello World'

global关键字允许您直接分配给全局变量。

于 2013-01-09T23:12:13.547 回答
0

如果要doStuff更改范围内的值testmain()则应将其返回,如下所示:

def doStuff(test):
    test = "hello world"
    return test

def main():
    test = None
    test = doStuff(test)
    print(test)

当然,在这个例子中,没有理由将 test 作为输入传递给doStuff(),所以你可以这样做:

def doStuff():
    test = "hello world" # These 2 lines could be one
    return test          # return "hello world"

def main():
    test = doStuff()
    print(test)
于 2013-01-09T23:14:48.420 回答
0

您不能直接从另一个函数更改局部变量的值 - 正如其他人回答的那样,您可以将其声明为全局变量,或返回新值并分配它。但是另一种尚未提及的实现此目的的方法是使用将值保存在属性中的包装类。然后您可以传递包装器实例并修改属性:

class Wrapper():
    """a simple wrapper class that holds a single value which defaults to None"""
    def __init__(self, value=None):
        self.value = value

def main():
    test = Wrapper()
    doSomething(test)
    print(test.value)

def doSomething(x):
    x.value = "something"
于 2013-01-09T23:30:29.827 回答