小编And*_*kov的帖子

空字典作为python函数中关键字参数的默认值:在后续调用中,字典似乎没有被初始化为{}?

这是一个功能.我的意图是使用关键字参数默认值使字典成为空字典(如果未提供).

>>> def f( i, d={}, x=3 ) :
...     d[i] = i*i
...     x += i
...     return x, d
... 
>>> f( 2 )
(5, {2: 4})
Run Code Online (Sandbox Code Playgroud)

但是当我接下来打电话给f时,我得到:

>>> f(3)
(6, {2: 4, 3: 9})
Run Code Online (Sandbox Code Playgroud)

看起来第二次调用时的关键字参数d不指向空字典,而是指向前一次调用结束时留下的字典.每次通话时,号码x重置为3.

现在我可以解决这个问题,但我希望你的帮助能够理解这一点.我相信关键字参数在函数的本地范围内,并且一旦函数返回就会被删除.(如果我不精确,请原谅并纠正我的术语.)

因此,应删除名称d指向的本地值,并在下一次调用时,如果我不提供关键字参数d,则应将d设置为default {}.但正如您所看到的,d被设置为前一个调用中指向的字典.

到底是怎么回事?

literal {}在封闭范围的防线?

在2.5,2.6和3.1中可以看到此行为.

python dictionary scope keyword-argument

26
推荐指数
1
解决办法
2万
查看次数

在使用pdb调试python时如何更改值?

我想运行pdb,逐步执行代码,并在某些时候更改某个名称指向的值.所以我可能想要更改名称'stationLat'指向的值.但似乎我做不到.这是一个例子:

>>> import extractPercentiles
>>> import pdb
>>> pdb.run( "extractPercentiles.extractOneStation()" )
> <string>(1)<module>()->None
(Pdb) s
--Call--
> /scratch/extractPercentiles.py(96)extractOneStation()
-> def extractOneStation() :
(Pdb) tbreak 132
Breakpoint 3 at /scratch/extractPercentiles.py:132
(Pdb) c

Deleted breakpoint 3
> /scratch/extractPercentiles.py(132)extractOneStation()
-> stationLon = float(stationLoc[3])
Run Code Online (Sandbox Code Playgroud)

所以现在我在一个我想改变stationlat价值的地方.Pdb似乎允许我将stationLat设置为新值,但是当我检查该值时,它保持不变:

(Pdb) stationLat
-34.171100000000003
(Pdb) stationLat = -40
(Pdb) stationLat   
-34.171100000000003
(Pdb) !stationLat = -40
(Pdb) stationLat
-34.171100000000003
(Pdb) 
Run Code Online (Sandbox Code Playgroud)

你可以看到我试过用!同样,没有成功.

pdb手册说我应该能够改变变量:

调试器无法识别的命令被假定为Python语句,并在被调试程序的上下文中执行.Python语句也可以带有感叹号(!)作为前缀.这是检查正在调试的程序的有效方法; 甚至可以更改变量或调用函数

这是范围问题吗?是否与我开始pdb的方式有关?我尝试了嵌入式"pdb.set_trace"习惯用法,我得到了相同的结果.

谢谢阅读.

python debugging pdb

14
推荐指数
1
解决办法
8309
查看次数

你如何在一个你无法访问其定义的函数上使用python decorator?

假设出于管理原因,我没有对模块xxx的写访问权.

我想做的事情如下:

from xxx import yyy

@myDeco
yyy
Run Code Online (Sandbox Code Playgroud)

当然失败了.

我想我能做到

yyy = myDeco(yyy)
Run Code Online (Sandbox Code Playgroud)

但有没有办法使用@myDeco"符号?或者这是否只允许在一个之前def

python decorator

3
推荐指数
1
解决办法
117
查看次数

python重载功能有哪些应用?

我一直想知道python中的reload()函数,如果不小心使用它似乎会导致问题.

你为什么要重新加载一个模块,而不是再次停止/启动python?

我想一个应用程序可能是以交互方式测试模块的更改.

python

1
推荐指数
1
解决办法
335
查看次数