返回函数中的变量Python不能正常工作

时间:2013-08-04 03:43:31

标签: python variables return-value

我一直在尝试在变量函数中返回一个变量,并在它之外使用它:

test = 0

def testing():
    test = 1
    return test

testing()
print(test)

但是当我运行它时,结果是0.我怎么能解决这个问题呢?

5 个答案:

答案 0 :(得分:7)

你搞砸了范围和/或作业。试试这个:

test = 0

def testing():
    test = 1
    return test

test = testing()
print(test)

说明:test内的testing与模块内的test不同。您必须在模块级别分配它才能获得预期的结果。

答案 1 :(得分:2)

因为你在函数中声明test,它不是一个全局变量,因此,你不能访问你在它之外的函数中创建的变量test,因为它们是不同的范围

如果你想return test变量,你必须

result = testing()
print(result)

或者,您也可以添加global声明:

test = 0

def testing():
    global test
    test = 1
    return test

testing()
print(test)

顺便说一句,在进行条件语句时,你不需要1==1附近的括号:)。

答案 2 :(得分:1)

在函数testing()中,您正在创建一个新变量test而不是指的是已存在的变量。如果你想这样做,你应该在顶部使用global语句,如:

def testing():
    global test
    ...etc...

答案 3 :(得分:1)

函数内的test变量没有全局范围。因此,如果要将返回值存储在变量中并在此之后输出,则可以执行以下操作:

result = testing()
print(result)

答案 4 :(得分:0)

TLDR:必须将return分配给在呼叫站点上。

test = testing()

Python中的函数有自己的作用域。它是在输入(调用)函数时创建的,并在离开函数时销毁。分配给作用域内的名称会使该名称在该作用域内本地化-导致其与作用域一起被破坏。

# start outer scope
test = 0  # create name outer:test

def testing():
    # start inner scope
    test = 1  # create name outer.testing:test
    return test
    # end inner scope
    # destroy name outer.testing:test

testing()  # new temporary inner scope outer.testing
print(test)  # use name outer:test
# end outer scope

值得注意的是,内部作用域中的名称可以是外部作用域中的“ shadow”名称。尽管test和外部作用域中都存在名称testing,但它不是指同一事物。这有两个重要含义:

  1. 分配给内部 test不会影响外部 test
  2. testing的结尾处,内部 test被销毁,只有外部 test保留。

这就是为什么调用testing()并没有达到预期效果的原因:它永远不会修改传递给test的外部print


The return statement defines the value returned by calling a function.不会返回名称,仅返回指向的值。

def testing():
    test = 1  # test refers to the value 1
    return test  # return test => value 1

函数返回的值与其他任何值一样-是从文字,查找或其他值返回的。最重要的是,除非将该值分配给名称或直接使用它,否则该值不会持久。

testing()  # call test, discard its value
test = testing()  # call test, store its value as `test`
print(testing())  # call test, use its value in `print`

因此,为了从函数中返回某些内容以供以后使用,必须将结果存储为名称。然后,您可以在以后的语句中使用该名称。您的案例的一个最小示例如下:

# we already can define testing here
# it is overwritten later on, then

def testing():
    # all names we use inside of testing are gone at the end
    # if we just want a value, we can skip temporary names
    return 1

# store the return value of testing() for later use
test = testing()
print(test)

附录:函数可以 修改其包含范围。但是,然后必须将名称明确声明为来自外部作用域。

使用nonlocalglobal关键字可以从外部范围修改名称。 nonlocal是最接近的匹配函数范围中的名称。 global是模块作用域中的名称,而不管它们之间的任何功能。

test = 0

def increment():
    global test  # declare test as belonging to a specific scope
    test += 1
    # no need to return something
    # we already modified the outer `test`

print(test)  # 0
increment()
print(test)  # 1

请注意,修改外部名称通常是反模式的标志,与global相比,nonlocal s更是如此。除了小型脚本,很难跟踪正在访问和修改global的内容。通常,使用类或生成器来保持状态更为合适。

一个函数可以始终从其包含的范围读取名称,只要它从不写入相同的名称。这样的closures非常易于创建,并且缺少修改使其更易于跟踪。请注意,除非在声明中声明globalnonlocal,否则在函数中的任何地方修改名称​​ 都会使其成为本地名称:

test = 0

def increment():
    global test
    test += 1

def show_test():
    # we never modify `test`, so it is fetched from the outside
    print(test)

def show_and_increment1():  # this function is broken!
    print(test)  # `test` is *not* the outer one, since we modify it in the function
    test += 1  # modifying `test` makes it local for the *entire* function

def show_and_increment2():  # this function works!
    global test  # force `test` to be global
    print(test)
    test += 1

show_test()  # 0
increment()
show_test()  # 1
show_and_increment2()  # 1
show_and_increment2()  # 2
show_and_increment2()  # 3
show_test()  # 4
show_and_increment1()  # UnboundLocalError: local variable 'test' referenced before assignment