函数内外变量的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