Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.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,少于10行)_Python - Fatal编程技术网

关于以下代码的运行结果(Python,少于10行)

关于以下代码的运行结果(Python,少于10行),python,Python,给出这段代码(python) 为什么这个结果是10个9,而不是0,1,2,3,…9 顺便说一句,我还打印了s[0]~s[9],这是10个函数地址,它们彼此不同 您已经在i上创建了一组闭包,但是它们都共享i的相同(最终)值 你需要像这样做一个小小的修改 >>> s = [None]*10 >>> def func(): ... for i in range(10): ... def update(i=i): ...

给出这段代码(python)

为什么这个结果是10个9,而不是0,1,2,3,…9


顺便说一句,我还打印了s[0]~s[9],这是10个函数地址,它们彼此不同

您已经在
i
上创建了一组闭包,但是它们都共享
i
的相同(最终)值

你需要像这样做一个小小的修改

>>> s = [None]*10
>>> def func():
...     for i in range(10):
...         def update(i=i):
...             print i,
...         s[i] = update
... 
>>> func()
>>> for i in range(10):
...     s[i]()
... 
0 1 2 3 4 5 6 7 8 9

您已经在
i
上创建了一组闭包,但它们都共享
i
的相同(最终)值

你需要像这样做一个小小的修改

>>> s = [None]*10
>>> def func():
...     for i in range(10):
...         def update(i=i):
...             print i,
...         s[i] = update
... 
>>> func()
>>> for i in range(10):
...     s[i]()
... 
0 1 2 3 4 5 6 7 8 9

@gnibbler的代码将修复您的代码(因此,如果有人的答案,请接受他的答案)。至于为什么要打印所有9个,请查看您的
update
功能。您(同样,正如@gnibbler所提到的)不断返回您在
中为范围(10)
中的i定义的i。由于在原始代码中,您没有使用函数参数调用
update
方法,因此它只打印在
func
范围中定义的
i
(一个完全不同的
i
,函数完成后将为9)


为了更清楚地说明问题,请尝试将
func
中的
i
更改为一个完全不同的名称-结果将是相同的。

@gnibler的代码将修复您的代码(因此,如果有人的答案,请接受他的答案)。至于为什么要打印所有9个,请查看您的
update
功能。您(同样,正如@gnibbler所提到的)不断返回您在
中为范围(10)
中的i定义的i。由于在原始代码中,您没有使用函数参数调用
update
方法,因此它只打印在
func
范围中定义的
i
(一个完全不同的
i
,函数完成后将为9)


为了更清楚,请尝试将
func
中的
i
更改为完全不同的名称-结果将是相同的。

发生的情况与此相同:

>>> a = 5
>>> def foo(): print(a)

>>> foo()
5
>>> a = 10
>>> foo()
10
>>> a = 'fred'
>>> foo()
fred
>>> def bar(): return b

>>> bar()
Traceback (most recent call last):
  File "<pyshell#30>", line 1, in <module>
    bar()
  File "<pyshell#29>", line 1, in bar
    def bar(): return b
NameError: global name 'b' is not defined
>>> b = 3
>>> bar()
3
也与此相同:

>>> a = 5
>>> def foo(): print(a)

>>> foo()
5
>>> a = 10
>>> foo()
10
>>> a = 'fred'
>>> foo()
fred
>>> def bar(): return b

>>> bar()
Traceback (most recent call last):
  File "<pyshell#30>", line 1, in <module>
    bar()
  File "<pyshell#29>", line 1, in bar
    def bar(): return b
NameError: global name 'b' is not defined
>>> b = 3
>>> bar()
3
>>定义栏():返回b
>>>bar()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
bar()
文件“”,第1行,条形图
def bar():返回b
NameError:未定义全局名称“b”
>>>b=3
>>>bar()
3.
函数中使用的变量只有在函数被调用时才会解析,而不是在函数被编写时解析。有一种称为闭包的魔力,这意味着在其他函数中定义的函数(正如您的
update
函数是在
func
中定义的)仍然可以访问外部函数中定义的所有变量,但在调用该函数之前,它们实际上仍然无法解析。因此,在调用每个
update
函数时,
i
为9


使用默认参数值(如@gnibbler的答案中所示)是有效的,因为每个
update
查找的
i
将解析为参数(它会遮挡外部变量)。这些不会改变,因为在定义函数时会计算默认参数值(这也会导致很多人迟早会遇到的问题)

发生的事情与此相同:

>>> a = 5
>>> def foo(): print(a)

>>> foo()
5
>>> a = 10
>>> foo()
10
>>> a = 'fred'
>>> foo()
fred
>>> def bar(): return b

>>> bar()
Traceback (most recent call last):
  File "<pyshell#30>", line 1, in <module>
    bar()
  File "<pyshell#29>", line 1, in bar
    def bar(): return b
NameError: global name 'b' is not defined
>>> b = 3
>>> bar()
3
也与此相同:

>>> a = 5
>>> def foo(): print(a)

>>> foo()
5
>>> a = 10
>>> foo()
10
>>> a = 'fred'
>>> foo()
fred
>>> def bar(): return b

>>> bar()
Traceback (most recent call last):
  File "<pyshell#30>", line 1, in <module>
    bar()
  File "<pyshell#29>", line 1, in bar
    def bar(): return b
NameError: global name 'b' is not defined
>>> b = 3
>>> bar()
3
>>定义栏():返回b
>>>bar()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
bar()
文件“”,第1行,条形图
def bar():返回b
NameError:未定义全局名称“b”
>>>b=3
>>>bar()
3.
函数中使用的变量只有在函数被调用时才会解析,而不是在函数被编写时解析。有一种称为闭包的魔力,这意味着在其他函数中定义的函数(正如您的
update
函数是在
func
中定义的)仍然可以访问外部函数中定义的所有变量,但在调用该函数之前,它们实际上仍然无法解析。因此,在调用每个
update
函数时,
i
为9


使用默认参数值(如@gnibbler的答案中所示)是有效的,因为每个
update
查找的
i
将解析为参数(它会遮挡外部变量)。这些不会改变,因为在定义函数时会计算默认参数值(这也会导致很多人迟早会遇到的问题)

实际上,背景是我有一些小部件存储在一个列表中。我需要给每个小部件一个回调函数,就像上面的代码一样编写。我发现所有小部件的回调函数都和上一个一样。实际上,背景是我有一些小部件存储在一个列表中。我需要给每个小部件一个回调函数,就像上面的代码一样编写。我发现所有小部件的回调函数都和上一个一样。这是修复bug的好方法。谢谢,虽然这是完全正确的,但我不认为说“它们是闭包”就足以解释为什么这种修改有效——如果OP了解闭包是什么并且做什么,他们就不必问这个问题。这是修复错误的好方法。谢谢虽然这是完全正确的,但我不认为说“它们是闭包”就足以解释为什么这一修改有效-如果OP了解闭包是什么并且做什么,他们就不必问这个问题了。@gnibbler会起作用,因为在更新中,函数的参数已经生成了I的shaddow副本。然而,这将工作,因为我是一个整数。如果我是一个列表或dict,这意味着当New_i=i时,New_i只是对i的引用,该怎么办?@user894625实际上,如果
i
是可变的,并且您的循环对其进行了变异,则默认参数将不起作用。在这种情况下,您必须执行
update(i=copy(i))
,从中使用
copy
i=i[:]
也适用于列表,但不一定适用于其他内容)。例如,如果您正在对列表列表进行迭代,则不需要执行此操作-仅当您更改相同的列表且