函数内外变量的Python作用域

函数内外变量的Python作用域,python,Python,考虑以下代码: def square(x): return x**2. def cube(x): return x**3. def some_func(): foo['a'] = 1. foo['b'] = 3. if foo['b'] > foo['a']: bar = square else: bar = cube foo = dict() bar = None some_func() pri

考虑以下代码:

def square(x):
    return x**2.

def cube(x):
    return x**3.

def some_func():
    foo['a'] = 1.
    foo['b'] = 3.

    if foo['b'] > foo['a']:
        bar = square
    else:
        bar = cube

foo = dict()

bar = None

some_func()

print(foo['a'])

print(bar(2))
开头初始化了两个不同的变量,
foo
bar
。然后我运行一个函数,它不接受参数或返回任何东西,而是修改这两个变量

这两方面的结果如下:

1.0
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-7e5e5ac79215> in <module>
     22 print(foo['a'])
     23 
---> 24 print(bar(2))

TypeError: 'NoneType' object is not callable
1.0
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在里面
22打印(foo['a']
23
--->24份印刷品(条形图(2))
TypeError:“非类型”对象不可调用
因此,dict很高兴地被
some_func()
修改,但我无法指定函数名。为什么?我怎么能绕过这个


编辑:我尝试过给
提供除
以外的其他值,类似的行为也会发生。

尝试用全局语句替换需要替换的内容(而不仅仅是修改):


HTH

尝试用全局语句替换(而不仅仅是修改)需要替换的内容:


这与python中的作用域有关。您可以在本文中阅读更多关于它的内容:


给定的代码解决方案是在if语句之前的函数中添加:
global bar
,将其指向您试图设置的全局变量。

这与python中的作用域有关。您可以在本文中阅读更多关于它的内容:


给定的代码解决方案是在if语句之前的函数中添加:
global bar
,将其指向您试图设置的全局变量。

为了从
some_func()
分配到全局
bar
,您需要声明它
global
,如下所示:

def some_func():
    foo['a'] = 1.
    foo['b'] = 3.

    global bar

    if foo['b'] > foo['a']:
        bar = square
    else:
        bar = cube
请参见,特别是本节:

全球声明是一项适用于整个世界的声明 当前代码块。这意味着列出的标识符将被删除 解释为全局的。而使用全局名称是自动的,如果 如果未在本地范围中定义,则将指定给全局名称 没有全球合作是不可能的


您的程序清楚地演示了此处指定的差异:您对
foo
的访问使用全局名称,而对
bar
的访问则分配给全局名称。

为了从
某些函数()
分配给全局
bar
,您需要声明它
global
,如下所示:

def some_func():
    foo['a'] = 1.
    foo['b'] = 3.

    global bar

    if foo['b'] > foo['a']:
        bar = square
    else:
        bar = cube
请参见,特别是本节:

全球声明是一项适用于整个世界的声明 当前代码块。这意味着列出的标识符将被删除 解释为全局的。而使用全局名称是自动的,如果 如果未在本地范围中定义,则将指定给全局名称 没有全球合作是不可能的

您的程序清楚地演示了此处指定的差异:您对
foo
的访问使用全局名称,而对
bar
的访问则分配给全局名称。

在某些函数()中,您正在向
foo
引用的字典对象添加键值对。您正在直接编辑对象<代码>栏正在引用
None
对象。当您尝试在
some_func()
的内部重新分配标签
bar
的值时,它会这样做,但仅针对它所在的函数范围。当它离开函数时,无论
bar
变量引用了什么,在本例中,
None
都是它仍然引用的

区别在于,您正在操作对象
foo
指向,但完全更改了
bar
指向的对象。如果您可以使用
None
对象执行任何操作,那么您也可以在
some_func()
中对其进行操作

这里有些人提供了
global
选项,但除非您确实确定,否则这可能不是您想要的。要真正为
bar
指定一个新值,应将其作为
some_func()
的结果返回。另外,您可以考虑将代码< Foo> <代码>作为参数输入到<代码> SoaSype()/<代码>中,这样就清楚了您引用的变量。

def方形(x):
返回x**2。
def多维数据集(x):
返回x**3。
定义一些函数(foo):
foo['a']=1。
foo['b']=3。
如果foo['b']>foo['a']:
条形=方形
其他:
条形=立方体
回程杆
foo=dict()
bar=一些函数(foo)
在某些函数()中,您正在向
foo
引用的dictionary对象添加键值对。您正在直接编辑对象<代码>栏正在引用
None
对象。当您尝试在
some_func()
的内部重新分配标签
bar
的值时,它会这样做,但仅针对它所在的函数范围。当它离开函数时,无论
bar
变量引用了什么,在本例中,
None
都是它仍然引用的

区别在于,您正在操作对象
foo
指向,但完全更改了
bar
指向的对象。如果您可以使用
None
对象执行任何操作,那么您也可以在
some_func()
中对其进行操作

这里有些人提供了
global
选项,但除非您确实确定,否则这可能不是您想要的。要真正为
bar
指定一个新值,应将其作为
some_func()
的结果返回。另外,您可以考虑将代码< Foo> <代码>作为参数输入到<代码> SoaSype()/<代码>中,这样就清楚了您引用的变量。

def方形(x):
返回x**2。
def多维数据集(x):
返回x**3。
定义一些函数(foo):
foo['a']=1。
foo['b']=3。
如果foo['b']>foo['a']:
条形=方形
其他:
条形=立方体
回程杆
foo=dict()
bar=一些函数(foo)
将东西放入d