python 一个函数怎么使用另一个函数内的变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 一个函数怎么使用另一个函数内的变量相关的知识,希望对你有一定的参考价值。

例如一个函数内有一个变量i,怎么在函数外或另一个函数中调用或更改它。新手学习,谢谢。

例如一个函数内有一个变量i,怎么在函数外或另一个函数中调用或更改它。新手学习,谢谢。

==============================

不能在函数外更改某函数里的局部变量,因为每当你实例化那个函数的时候,那个函数里面的局部变量也会被重新赋值,重新定义,谈何更改呢?

这一个全部变量和局部变量的问题,如果要实现楼主说的,必须使用全局变量(类中的self):

================bianliang.py===========
#coding: utf-8
i = 0 #定义一个全局变量i

def a():
'''
打印出i的值
'''
print i

def b():
global i

a() #调用a方法
print i #打印i
i = 1000 #重新赋值i
print i #打印i
a() #再次调用a方法

b()
=================================

%python bianliang.py
0
0
1000
1000

这个py文件里面使用了一个全局变量i,实现了a方法和b方法共用参数i
参考技术A

用闭包

再来看看专业的解释:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

def make_adder(addend):
    def adder(augend):
        return augend + addend
    return adder

p = make_adder(23)
q = make_adder(44)print p(100)print q(100)

运行结果:
123
144

Python:修改内部方法内的方法局部变量

【中文标题】Python:修改内部方法内的方法局部变量【英文标题】:Python: modify method-local variable inside inner method 【发布时间】:2016-05-23 22:40:12 【问题描述】:

我正在编写一个名为 test_foo 的测试方法(使用 pytest)。我正在测试一个函数foo 的行为,该函数将另一个函数get 作为参数。 foo 迭代调用get,有条件地根据get 的返回值,例如:

def foo(get, param):
    max_num_tries = 3
    curr_num_tries = 0
    response = get(param)
    while curr_num_tries < max_num_tries and response.status_code == BAD_STATUS_CODE:
        response = get(param)
    return response

我正在尝试覆盖get,以便它可以访问它被调用的次数并可以相应地返回不同的值。

这是我目前所拥有的简化版本:

def test_foo():
    tries_so_far = 0

    def get(arg1):
        global tries_so_far
        if tries_so_far < 3:
            tries_so_far += 1
            print("do something special here")
        else:
            print("do something else here")
        return "some return val"

    foo(get, "some arg")

但是,我收到以下错误:

NameError: global name 'tries_so_far' is not defined

如果我在test_foo 之外定义tries_so_far,在模块级别,我会得到预期的行为。但是,我希望 tries_so_far 成为 test_foo 的本地变量。

有没有办法让get 使用全局变量或其他技术对tries_so_far 进行读/写?注意:我无法更改get的参数或返回值。

【问题讨论】:

您似乎没有使用对 tries_so_far 的写入权限。只需删除global,它将能够读取变量。 global 表示“模块级别”,正如您已正确确定的那样。 对不起 - 我忘了把它添加到我的例子中。已更新。 我假设您使用的是打印语句中的 Py3k。如果是这样,您可以更改标签吗? 【参考方案1】:

根据这个问题Why can functions in Python print variables in enclosing scope but cannot use them in assignment? 的公认答案,Python 3 中添加了一条附加语句:nonlocal 可以满足您的需求。它类似于global,但表示要查看封闭范围而不是模块级别。因此,以下修改应该可以让您完全按照自己的意愿行事:

def test_foo():
    tries_so_far = 0

    def get(arg1):
        nonlocal tries_so_far
        if tries_so_far < 3:
            tries_so_far += 1
            print("do something special here")
        else:
            print("do something else here")
        return "some return val"

    foo(get, "some arg")

虽然您的问题与我上面引用的问题并不完全相同,但您应该阅读已接受的答案。它非常好,可能会解决您对此主题的许多未说明的问题。

【讨论】:

以上是关于python 一个函数怎么使用另一个函数内的变量的主要内容,如果未能解决你的问题,请参考以下文章

Python:修改内部方法内的方法局部变量

Python模拟补丁在另一个函数内的一个函数

如何从Python中的另一个函数调用函数内的函数? [重复]

从另一个返回对象内的函数的返回对象中构造变量

python怎么调用另一个路径下py文件的函数

python中是如何实现将一个函数中定义的变量在另一个函数中改变其值的