变量实例化为'None'是否在Python中按值传递?

时间:2013-01-09 23:04:10

标签: python python-3.x

  

可能重复:
  Python - how does passing values work?

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

例如:

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

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

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

4 个答案:

答案 0 :(得分:2)

执行此操作时:

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

您必须打印test范围内的字符串对象(由main()引用引用)。要printtest变量引用的doStuff内部字符串对象,您应该执行以下任一操作中的任何一个:

  • 您应该在print

  • 中使用doStuff语句
  • 或使用global关键字

  • 返回doStuff main() test中{{1}}的值。

对于最后一部分,您可以找到更多信息here

答案 1 :(得分:0)

您可以查看global关键字。

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

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

答案 2 :(得分:0)

如果您希望doStuff更改test范围内main()的值,则应将其返回,如下所示:

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

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

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

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

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

答案 3 :(得分:0)

您无法直接从其他函数更改 local 变量的值 - 正如其他人所回答您可以将其声明为全局,或返回新值并进行分配。但另一种实现这一目标尚未提及的方法是使用包含属性值的包装类。然后你可以传递包装器实例并修改属性:

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"