Python 如何从函数中引用外部变量?
更新:对不起,我对这个问题的假设是错误的。这是因为我试图使函数并行,并让多个进程更改同一个字典。我如何设计我的功能,使它允许这一点?如果我必须发送字典(在本例中),那么它将不断覆盖自身,无法覆盖所有核心。我很乐意重新设计这个功能,但不确定我如何才能做到这一点,并且仍然将它扩展到多个内核上 为了简化,我基本上有如下内容:Python 如何从函数中引用外部变量?,python,Python,更新:对不起,我对这个问题的假设是错误的。这是因为我试图使函数并行,并让多个进程更改同一个字典。我如何设计我的功能,使它允许这一点?如果我必须发送字典(在本例中),那么它将不断覆盖自身,无法覆盖所有核心。我很乐意重新设计这个功能,但不确定我如何才能做到这一点,并且仍然将它扩展到多个内核上 为了简化,我基本上有如下内容: list = [1,2,3,10] dictionary = {} for x in list: for xx in range(100): for xx
list = [1,2,3,10]
dictionary = {}
for x in list:
for xx in range(100):
for xxx in range(100):
dictionary[x]=xx*xxx
这是可行的,但当我将for循环包装到函数中时,我得到:
NameError:未定义全局名称“dictionary”
def test(x):
for xx in range(100):
for xxx in range(100):
dictionary[x]=xx*xxx
我知道这与名称空间有关,但我不想在这种情况下向函数发送变量,因为我认为它会覆盖变量字典。在函数中如何引用dictionary变量?我问的原因是我想创建一个跨越多个cpu的进程,所以我不想在每个函数中声明变量
我正在使用函数,但如果我需要使用类或有其他方法解决此问题,请告诉我,我将重新考虑我的方法。请重试:
lst = [1,2,3,10]
dictionary = {}
def test(x):
for xx in range(100):
for xxx in range(100):
dictionary[x]=xx*xxx
for x in lst:
test(x)
只有在未定义名称时才会出现namererror
。它与作用域无关。请重试:
lst = [1,2,3,10]
dictionary = {}
def test(x):
for xx in range(100):
for xxx in range(100):
dictionary[x]=xx*xxx
for x in lst:
test(x)
只有在未定义名称时才会出现namererror
。它与作用域无关
如何从函数中引用外部变量
不要。将其作为参数传递
如何从函数中引用外部变量
不要。将其作为参数传递。尽量避免使用全局变量,并将所需的变量传递到函数中:
>>> def test(x, dictionary):
... for xx in range(100):
... for xxx in range(100):
... dictionary[x] = xx * xxx
...
>>> list_of_numbers = [1, 2, 3, 10]
>>> dictionary = {}
>>>
>>> for x in list_of_numbers:
... test(x, dictionary)
...
>>> print dictionary
{1: 9801, 2: 9801, 3: 9801, 10: 9801}
我已经重命名了,因为它是Python内置的
这显然可以简化为:
>>> for x in list_of_numbers:
... dictionary[x] = 99 * 99
尽量避免使用全局变量,并将所需的变量传递给函数:
>>> def test(x, dictionary):
... for xx in range(100):
... for xxx in range(100):
... dictionary[x] = xx * xxx
...
>>> list_of_numbers = [1, 2, 3, 10]
>>> dictionary = {}
>>>
>>> for x in list_of_numbers:
... test(x, dictionary)
...
>>> print dictionary
{1: 9801, 2: 9801, 3: 9801, 10: 9801}
我已经重命名了,因为它是Python内置的
这显然可以简化为:
>>> for x in list_of_numbers:
... dictionary[x] = 99 * 99
啊,你说得对……我自己试过了,效果很好。我试图将我拥有的一个进程封装到上面的函数中,这样我就可以使用pp模块让多个CPU在上面工作。似乎是在我用它创造就业机会的时候发生的。啊,你说得对。我自己试过,效果很好。我试图将我拥有的一个进程封装到上面的函数中,这样我就可以使用pp模块让多个CPU在上面工作。似乎是在我使用它创造就业机会的时候发生的。但是我想避免传递大量的参考变量。你到底希望“大量”的引用变量是什么?也许你的函数需要重新设计。例如,假设我有一个函数和一个计数器来计算它成功的次数。如果我将作业分发到多个CPU上,那么每次创建新进程时,将作业发送到每个函数将重新启动计数器。@Lostsoul:然后将数据放入dict并传入,然后在函数中解包。对全局变量的引用通常是一件坏事。但是我想避免传递大量的引用变量。你到底希望需要“大量”的引用变量吗?也许你的函数需要重新设计。例如,假设我有一个函数和一个计数器来计算它成功的次数。如果我将作业分发到多个CPU上,那么每次创建新进程时,将作业发送到每个函数将重新启动计数器。@Lostsoul:然后将数据放入dict并传入,然后在函数中解包。引用全局变量通常是件坏事。