列表中被替换的元素不会在循环Python的外部结转

列表中被替换的元素不会在循环Python的外部结转,python,list,variables,indexing,scope,Python,List,Variables,Indexing,Scope,我正在尝试将数字列表转换为字母,我想知道为什么我的转换没有超出for循环。这是范围错误吗?对于任何写得不好的代码,我深表歉意,我对学习Python还是新手。非常感谢 cstring = [0, 3, 2, 1, 0, 0, 1, 3] for number in cstring: if number == 0: number = 'A' elif number == 1: number = 'C' elif number == 2:

我正在尝试将数字列表转换为字母,我想知道为什么我的转换没有超出for循环。这是范围错误吗?对于任何写得不好的代码,我深表歉意,我对学习Python还是新手。非常感谢

cstring = [0, 3, 2, 1, 0, 0, 1, 3]

for number in cstring:
    if number == 0:
        number = 'A'
    elif number == 1:
        number = 'C'
    elif number == 2:
        number = 'G'
    elif number == 3:
        number = 'T'

print(cstring)

输出为0 3 2 1 0 1 3。它应该是ATGCAACT。

要更改数组中的变量,必须定义其索引。您可以通过创建一个沿表示当前索引的for循环移动的变量来实现这一点

cstring = [0, 3, 2, 1, 0, 0, 1, 3]

i = 0
for number in cstring:
i += 1
    if number == 0:
        number[i] = 'A'
    elif number == 1:
        number[i] = 'C'
    elif number == 2:
        number[i] = 'G'
    elif number == 3:
        number[i] = 'T'

print(cstring)

您可以使用枚举和替换索引

cstring = [0, 3, 2, 1, 0, 0, 1, 3]

for num,ele in enumerate(cstring):
    if ele == 0:
        cstring[num] = 'A'
    elif ele == 1:
        cstring[num] = 'C'
    elif ele == 2:
        cstring[num] = 'G'
    elif ele == 3:
        cstring[num] = 'T'

print("".join(cstring))

当您说
number='A'
时,您只是在更改
number
变量的值。该变量与旧列表没有连接。处理此类问题的最佳方法是使用新Valius建立一个新列表:

cstring = [0, 3, 2, 1, 0, 0, 1, 3]
dna = []

for number in cstring:
    if number == 0:
        dna.append('A')
    elif number == 1:
        dna.append('C')
    elif number == 2:
        dna.append('G')
    elif number == 3:
        dna.append('T')
print(dna)
但是有更好的方法

dna = ["ACGT"[number] for number in cstring]

for循环将数组中的每个值复制到循环变量
number
。由于我们只是复制值,像
number='A'
这样的赋值对原始数组没有影响

相反,您应该对数组本身使用赋值,即执行类似于
cstring[i]='A'
的操作。尝试将for循环更改为

范围内的i(len(cstring)):

在遍历列表时修改列表不是一个好主意。在这种情况下,这不会造成伤害,但这不是一个好的做法。谢谢你的建议,我刚刚读了一些相关的东西,我会记住的!!