这是一个功能.我的意图是使用关键字参数默认值使字典成为空字典(如果未提供).
>>> 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中可以看到此行为.
我想运行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"习惯用法,我得到了相同的结果.
谢谢阅读.
假设出于管理原因,我没有对模块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中的reload()函数,如果不小心使用它似乎会导致问题.
你为什么要重新加载一个模块,而不是再次停止/启动python?
我想一个应用程序可能是以交互方式测试模块的更改.