python-3.x - 操作列表索引值,这个python代码有什么问题?
问题描述
我的意图是改变list1的索引值;list1 更改了值,但在两个不同的位置,而不仅仅是一个。list2 做了我想要对列表 1 做的事情。
list1 = []
list2 = [[[40], 70], [[[40], 70], 90]]
def append_values():
amount = None
if len(list1) == 0:
amount = 70
list1.append([[40],amount])
else:
amount = 90
list1.append([list1[-1],amount])
def alter_lists():
print('ori: ', list1) #Orginal list
list1[1][0][1] = "alt"
print('alt: ', list1) #Altered list
print('\n')
print('ori: ', list2) #Orginal list
list2[1][0][1] = 'alt'
print('alt: ', list2) #Altered list
append_values()
append_values()
alter_lists()
输出:
列表1
ori: [[[40], 70], [[[40], 70], 90]]
alt: [[[40], 'alt'], [[[40], 'alt'], 90]]
清单2
ori: [[[40], 70], [[[40], 70], 90]]
alt: [[[40], 70], [[[40], 'alt'], 90]]
解决方案
那是因为您将列表本身附加到if
块中。因此,当您在块中更改附加列表时,else
它会更改对原始列表的所有引用。你需要的是一个深拷贝,如下:
import copy
list1 = []
list2 = [[[40], 70], [[[40], 70], 90]]
def append_values():
amount = None
if len(list1) == 0:
amount = 70
list1.append([[40],amount])
else:
amount = 90
l = copy.deepcopy(list1)
list1.append([l[-1],amount])
def alter_lists():
print('ori: ', list1) #Orginal list
list1[1][0][1] = "alt"
print('alt: ', list1) #Altered list
print('\n')
print('ori: ', list2) #Orginal list
list2[1][0][1] = 'alt'
print('alt: ', list2) #Altered list
append_values()
append_values()
alter_lists()
给出:
ori: [[[40], 70], [[[40], 70], 90]]
alt: [[[40], 70], [[[40], 'alt'], 90]]
ori: [[[40], 70], [[[40], 70], 90]]
alt: [[[40], 70], [[[40], 'alt'], 90]]
推荐阅读
- python - Keras 自动编码器与 Tensorflow 数据集 API 并记录到 Tensorboard
- postgresql - 如何在私有云内的特定主机上验证 AWS 用户
- vb.net - 如何从幻灯片中删除所有图像,即 vb.net 中的项目资源文件?
- c - C - 在 switch 语句中分配值时,send() 不起作用
- batch-file - ASCII 艺术的批处理代码问题:“命令的语法不正确”
- python - 读取值并将它们写为逗号分隔值python
- asp.net - 为什么在每个文本框上输入事件运行第一个按钮单击
- php - 我如何使用 PHP 从 MySQL CONCAT 垂直线
- aws-sdk-cpp - S3 AWS C++ 客户端 Kerberos
- r - 将来自多个用户的输入保存在 www app 文件夹中,以便在新会话开始时始终更新?