python中使用enumerate遍历列表时需要注意的一个细节

在Python中,使用enumerate遍历列表是非常好的一种方式,它既能获得列表中的每个元素的索引,又能获得元素值,可谓一举两得,然而,在使用enumerate遍历列表,有时候会出现一些想不到的错误,举个例子,代码如下:

f = [[i,i+1,i+2,i+3]for i in range(0,16,4)]
print('初始化的:',f)
for i,data in enumerate(f):
    f[i][1] = data[1] - 10    ###方式1
    f[i][3] = data[3] - 10

    # tmp = data.copy()       ###方式2
    # f[i][1] = tmp[1] - 10
    # f[i][3] = tmp[3] - 10

    # data = f[i].copy()    ###方式3
    # f[i][1] = data[1] - 10
    # f[i][3] = data[3] - 10

    # data[1] = f[i][1] - 10    ###方式4
    # data[3] = f[i][3] - 10

    # f[i] = data.copy()    ###方式5
    # data[1] = f[i][1] - 10
    # data[3] = f[i][3] - 10

    print(f[i],' , ',data)

在使用enumerate遍历列表时,我们会有一个疑问,就是data与f[i]是共享一片内存数据,还是相互独立的呢?

在上面的例子中,我们首先定义一个长度为4的列表f,并且列表中的额每个元素也是长度为4的列表,接下来我们使用enumerate遍历列表,为了试验data与f[i]是否共享一片内存数据,我们改变f[i]中的元素值,再打印f[i]和data,看data的值是否也跟着改变,程序运行的结果是

可以看到f[i]和data里的元素值相同。然而,我们把方式1里改变f[i]中的元素值的代码改为:

f[i][1] = f[i][1] - 10    ###方式1
f[i][3] = f[i][3] - 10

程序运行的结果依然同上。选择方式4运行,结果依然是data和f[i]中的元素值相同。这就说明data与f[i]是共享一片内存数据的,也就是说改变data或者f[i]里的元素值,f[i]或data的值也跟着改变,运行方式2依然如此。

那么,如果我们想data和f[i]是彼此独立着,改变data或者f[i]里的元素值,f[i]或data的值不会跟着改变,我们就需要先对data或者f[i]做一个数据拷贝,也就是上面代码中的方式3和方式5。

综上所述,如果一个列表里的元素是列表,那么用enumerate遍历列表时,data与f[i]是共享内存数据的,如果元素是单纯的数值,那么就不共享的,示例代码如下:

g = [i for i in range(16)]
print('初始化的:',g)
for i,data in enumerate(g):
    g[i] = data - 10
    print(g[i],' , ',data)

程序运行结果如下:

可以看到g[i]和data的值不相同,这说明g[i]和data不是共享内存数据的

猜你喜欢

转载自blog.csdn.net/nihate/article/details/92979051