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

in #cn4 years ago

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


(图源 :pixabay)

模板如下:

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

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

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

相关链接

Sort:  

能放个完整代码学习学习么?

Coin Marketplace

STEEM 0.20
TRX 0.13
JST 0.030
BTC 63713.30
ETH 3389.19
USDT 1.00
SBD 2.62