You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:13:55