在下面的代码中运行2.7.6,我使用argparse将命令行参数获取到kwargs字典中。然后我制作一个项目的副本并进行更改。根据字典项目是否开始空,我会得到不同的结果。python“reference to”vs“copy of”字典项目
该例程需要一个位置命令行参数,如COM6,9600,8,none,1
,它将进入COM键,但我想为除com端口之外的所有其他参数提供默认参数。
#split up COM params entered as comma delimited
cp = kwargs['COM']
if len(cp)==1:
cp = cp[0].split(',')
# provide defaults
if len(cp)<5:
if len(cp)<4:
if len(cp)<3:
if len(cp)< 2:
if len(cp)==0:
cp.append('') # no default port
cp.append(19200) #baud
cp.append(8) #databits
cp.append('none') #parity
cp.append(1) #stopbits
print cp
print kwargs['COM']
如果我运行"python myprog.py"
,没有PARAMS然后打印语句将
['', 19200, 8, 'none', 1]
['', 19200, 8, 'none', 1]
这是伟大的。不过,我很惊讶,运行"python myprog.py COM6"
产生
['COM6', 19200, 8, 'none', 1]
['COM6']
这意味着,在第一种情况下它是由引用复制,第二次按值复制。解决方法很简单,只需将cp复制回kwargs,但我对结果感到困惑。
任何人都可以解释一下吗?
Oh boy,dat indents – vaultah
如何使用默认列表并根据您已有多少值对其进行分片,并附加分片列表? 'cp + = ['',19200,8,'none',1] [len(cp):]'。这是11行嵌套'if's被一行代替。 –
我更正了你的示例;你*必须*打印'cp'然后'kwargs ['COM']'。这个细节会让答案更快。 :-) –