Python之再遇 (传值/引用) 错误

Python之再遇 (传值/引用) 错误

昨晚写了一小段测试代码,打算实现在一个事务(transaction)中放置多个操作(oprations),思路很简单,就是定义一个transfer opration的模板,然后设置,追加到transaction中,再设置一个新值,然后再次追加到transaction中。


(图源 :pixabay)

模板如下:

1
2
3
4
5
6
op = ['transfer',{
'from': '',
'to': '',
'amount': '',
'memo': ''
}]

设置过程大致如下:

op[1]["from"] = "oflyhigh.demo"
op[1]["to"] = "oflyhigh.test"
op[1]["amount"] = "0.005 HBD"
op[1]["memo"] = "Hello 1"
tx["operations"].append(op)

然后对op值进行重新设置,再次追加op到tx:

op[1]["from"] = "oflyhigh.demo"
op[1]["to"] = "oflyhigh.test"
op[1]["amount"] = "0.010 HBD"
op[1]["memo"] = "Hello 2"
tx["operations"].append(op)

然后对tx进行签名并广播,结果却发现写到链上变成了这个样子:

image.png

什么?怎么是两条一模一样的转账内容呢?不过稍一思索马上就想通了,据说Python当中一个变量保存的内容除了基本类型保存的是值外,其它都是引用

因为是按引用传递,那么我第一次追加后,第二次再修改op,修改的都是同一个op,所以最后的结果就是两个op都是相同的,都被替换成了第二个。

解决起来其实很简单,用copy.deepcopy处理一下就好啦,再测试就成功啦(op内容我改动了一点):

image.png

颇为感慨的是,其实这个问题我遇到过不止一次,比如在这个帖子中就写遇到的这个错误,然而每次遇到类似情况还是总犯错。

哎,年纪大了,记性不好啦。

相关链接


This page is synchronized from the post: ‘Python之再遇 (传值/引用) 错误’

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×