Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从函数中引用外部变量?_Python - Fatal编程技术网

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并传入,然后在函数中解包。引用全局变量通常是件坏事。