我一直在尝试在变量函数中返回一个变量,并在它之外使用它:
test = 0
def testing():
test = 1
return test
testing()
print(test)
但是当我运行它时,结果是0.我怎么能解决这个问题呢?
答案 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
,但它不是指同一事物。这有两个重要含义:
test
不会影响外部 test
。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)
附录:函数可以 修改其包含范围。但是,然后必须将名称明确声明为来自外部作用域。
使用nonlocal
和global
关键字可以从外部范围修改名称。 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非常易于创建,并且缺少修改使其更易于跟踪。请注意,除非在声明中声明global
或nonlocal
,否则在函数中的任何地方修改名称 都会使其成为本地名称:
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