Python诡异Bug:未修改变量enText却发生值变更
问题原因与解决办法
这是Python里非常常见的一个“新手坑”——列表属于可变对象,直接赋值操作只是传递对象的引用,而非创建独立的副本。
为什么原变量enText会被修改?
当你执行changeTxt = enText时,并没有把enText里的元素复制一份给changeTxt,而是让changeTxt和enText指向内存中同一个列表对象。打个比方,就像两个人拿着同一把钥匙开同一扇门,不管谁在门里修改东西,另一个人打开门看到的都是修改后的结果。
所以当你对changeTxt[x]做幂运算和取模赋值时,本质上是在修改这个共享的列表元素,enText作为同一个对象的引用,自然会同步看到变化。
如何解决?
你需要创建enText的独立副本,而不是直接引用。针对你的整数数组场景,有几种简单的方式:
切片法(最常用):
changeTxt = enText[:]切片
[:]会生成一个包含原列表所有元素的新列表,两者在内存中是完全独立的。使用
list()构造函数:changeTxt = list(enText)这种方式和切片效果一致,通过构造函数生成新列表。
如果你的列表是嵌套结构(比如列表里还有列表),需要用
copy模块的deepcopy做深度拷贝,但你的场景是整数数组,浅拷贝就足够了。
修正后的示例代码
def encrypt(enText, e=5, n=6): # 创建原列表的独立副本 changeTxt = enText[:] for x in range(len(changeTxt)): tmp = changeTxt[x] ** e tmp = tmp % n changeTxt[x] = tmp return changeTxt # 测试 enText = [18, 15, 2, 9, 14] result = encrypt(enText) print("加密后的结果:", result) print("原数组enText:", enText) # 现在原数组不会被修改了
这样修改后,changeTxt的操作就不会影响到原enText了。
内容的提问来源于stack exchange,提问作者Keith
相关产品推荐
相关产品推荐

